要处理的Java 8 Lambda用于>;如果>;其他的

要处理的Java 8 Lambda用于>;如果>;其他的,java,if-statement,lambda,parallel-processing,java-8,Java,If Statement,Lambda,Parallel Processing,Java 8,我需要根据一大堆过滤器运行两个不同的任务 我刚刚掌握了Lambdas的概念,所以我想我的问题是,如何处理包含复杂逻辑的多个“else”条件。。。在一个λ之内 我知道我可以使用过滤器和映射来选择某些数据。“嵌套”如何与过滤器一起工作 我可以做一些类似于: //Iterate over list of sites sites.stream() //Check if current site is active .map(isActive ? //{Do something with site be

我需要根据一大堆过滤器运行两个不同的任务

我刚刚掌握了Lambdas的概念,所以我想我的问题是,如何处理包含复杂逻辑的多个“else”条件。。。在一个λ之内

我知道我可以使用过滤器和映射来选择某些数据。“嵌套”如何与过滤器一起工作

我可以做一些类似于:

//Iterate over list of sites
sites.stream()
//Check if current site is active
.map(isActive ? 
//{Do something with site because site is active};
//Set a variable for later user maybe?
:
//{Do something else involving the current site because it's not?};
//Set a different variable maybe?
);

//use variable from first map?
有没有人能给我提供一些正确的语法,也许还有一个基本的解释,说明当我运行这些抽象过程时,我在对数据做什么,这些抽象过程在欺骗我

其次,如果我想并行运行这两个map进程,我会这样做吗

sites.stream().parallel()?

像往常一样,谢谢你帮助我克服无知

我将把复杂的逻辑放在一个单独的方法中,并在
映射(…)
中引用它

这将在类
Foo
中使用如下所示的方法:

public static String bar(Site site)
{
    return site.toString();
}
当然,您可以在方法中使用任意逻辑,但它应该没有副作用


是的,如果用于映射的方法是线程安全的,那么可以使用
parallel()
并行运行映射。

我将把复杂的逻辑放在一个单独的方法中,并在
映射(…)
中引用它

这将在类
Foo
中使用如下所示的方法:

public static String bar(Site site)
{
    return site.toString();
}
当然,您可以在方法中使用任意逻辑,但它应该没有副作用


是的,如果用于映射的方法是线程安全的,则可以使用
parallel()
并行运行映射。

您只需使用简单的
if

.map(site -> {
   if (isActive) {
     ...whatever...
   } else {
     ...whatever else...
   }
 })
 ...

如果,您只需使用简单明了的

.map(site -> {
   if (isActive) {
     ...whatever...
   } else {
     ...whatever else...
   }
 })
 ...

lambda用法的一些示例:

您可以按活动和非活动对站点进行分组,然后可以对两者执行一些逻辑。将大逻辑放入方法中,然后调用
map()
函数

您还可以使用
filter()
仅获取流的一部分

public class Lambda {

    static class Site {

        public boolean isActive;
        public boolean otherCondition;
        public boolean isActive() {
            return isActive;
        }

        public boolean isOtherCondition() {
            return otherCondition;
        }

        public void setProperty(String property) {

        }
    }
    public static Site someOperation(Site site) {

        //some code

        return site;
    }
    public static void main(String[] args) {

        ArrayList<Site> sites = new ArrayList<>();

        Map<Boolean, List<Site>> groupedSites = sites.stream().collect(Collectors.groupingBy(Site::isActive));          
        groupedSites.get(Boolean.TRUE).stream().filter(Site::isOtherCondition).map(Lambda::someOperation).forEach(p -> p.setProperty("something"));

    }
}
公共类Lambda{
静态类站点{
公共服务是积极的;
公共条件;
公共布尔isActive(){
回报是积极的;
}
公共布尔等温线条件(){
返回其他条件;
}
公共void setProperty(字符串属性){
}
}
公共静态站点操作(站点){
//一些代码
返回站点;
}
公共静态void main(字符串[]args){
ArrayList站点=新的ArrayList();
Map groupedSites=sites.stream().collect(Collectors.groupingBy(Site::isActive));
groupedSites.get(Boolean.TRUE).stream().filter(Site::isOtherCondition).map(Lambda::someOperation).forEach(p->p.setProperty(“something”);
}
}

lambda用法的一些示例:

您可以按活动和非活动对站点进行分组,然后可以对两者执行一些逻辑。将大逻辑放入方法中,然后调用
map()
函数

您还可以使用
filter()
仅获取流的一部分

public class Lambda {

    static class Site {

        public boolean isActive;
        public boolean otherCondition;
        public boolean isActive() {
            return isActive;
        }

        public boolean isOtherCondition() {
            return otherCondition;
        }

        public void setProperty(String property) {

        }
    }
    public static Site someOperation(Site site) {

        //some code

        return site;
    }
    public static void main(String[] args) {

        ArrayList<Site> sites = new ArrayList<>();

        Map<Boolean, List<Site>> groupedSites = sites.stream().collect(Collectors.groupingBy(Site::isActive));          
        groupedSites.get(Boolean.TRUE).stream().filter(Site::isOtherCondition).map(Lambda::someOperation).forEach(p -> p.setProperty("something"));

    }
}
公共类Lambda{
静态类站点{
公共服务是积极的;
公共条件;
公共布尔isActive(){
回报是积极的;
}
公共布尔等温线条件(){
返回其他条件;
}
公共void setProperty(字符串属性){
}
}
公共静态站点操作(站点){
//一些代码
返回站点;
}
公共静态void main(字符串[]args){
ArrayList站点=新的ArrayList();
Map groupedSites=sites.stream().collect(Collectors.groupingBy(Site::isActive));
groupedSites.get(Boolean.TRUE).stream().filter(Site::isOtherCondition).map(Lambda::someOperation).forEach(p->p.setProperty(“something”);
}
}

?我认为对于这些类型的任务,您最好坚持传统编程。我完全清楚……如果我有两个简单的程序路径,请执行任务1(如果为true),执行任务2(如果为false),lambda并不是真正可行的方法?也许您应该在站点对象中添加更多逻辑,让它们决定要执行的操作,请参阅。这样,您就可以从外部调用
sites.forEach(Site::doSomething)
,并将逻辑放入
Site
类中?我认为对于这些类型的任务,你最好坚持传统编程。我完全清楚……如果我有两个简单的程序路径,如果为真,那么执行任务1,如果为假,那么执行任务2,lambdas并不是真正的方法?也许你应该在你的站点对象中加入更多的逻辑,让它们决定做什么,请参阅。这样,您只需从外部调用
sites.forEach(Site::doSomething)
,并将逻辑放入
Site
类中。@TheFunk那里没有。lambda和streams并不总是最好的解决方案。@TheFunk没有。Lambdas和streams并不总是最好的解决方案。谢谢!这很有帮助!我现在可以利用多个处理器一次处理多个列表,代码就不那么复杂了。也许有点混乱,但总体来说不那么复杂!您可以将收集器.groupingBy(Site::isActive)
替换为收集器.PartitionBy(Site::isActive)。然后,您将得到一个优化的映射,以便将
true
false
精确映射到一个值,如果不匹配,它将有一个空列表,因此后续的
groupedSites.get(Boolean.true).stream()
在这种情况下不会抛出
NullPointerException
。另外,请注意,还有一个重载,它允许下游收集器在收集时正确执行操作,而不是将所有内容存储到列表中,然后执行流操作。@Holger噢,谢谢,我不知道这个方法,有用的注释。谢谢!这很有帮助!我现在可以利用多个处理器处理多个li