要处理的Java 8 Lambda用于>;如果>;其他的
我需要根据一大堆过滤器运行两个不同的任务 我刚刚掌握了Lambdas的概念,所以我想我的问题是,如何处理包含复杂逻辑的多个“else”条件。。。在一个λ之内 我知道我可以使用过滤器和映射来选择某些数据。“嵌套”如何与过滤器一起工作 我可以做一些类似于:要处理的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
//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