2016-11-30 29 views
1

试图学习新的实用lambda用法。Lambda的使用,以消除如果

我有这样的问题:

我有了内部的某些其他对象的列表的对象。这些对象具有MyEnum字段。我想遍历这些对象,获取该Enum的状态,然后根据该对象将对象添加到List1,如果条件满足。如果不是,我想将该对象添加到List2。

基本上将一个列表分割成两个具有特殊条件的不同列表。

我一直在通过两种方法来实现这个目标,一个是古老的,每个都是古典的,第二个是Java 8 lambda,我也试图学习。

我的两个代码:

void groupObjects() { 

    for (ListObject listObject : object.getList()) { 
     if (MyEnum.STATUS.equals(listObject.getStatus())) { 
      otherList.add(listObject); 
     } else { 
      someOtherList.add(listObject); 
     } 
    } 
} 


void groupObjects() { 

    object.getList().parallelStream() 
      .filter(listObject-> MyEnum.STATUS.equals(listObject.getStatus())) 
      .forEach(listObject-> otherList.add(listObject)); 
    object.getList().parallelStream() 
      .filter(listObject-> !MyEnum.STATUS.equals(listObject.getStatus())) 
      .forEach(listObject-> someOtherList.add(listObject)); 
} 

这在我的脑海提出的问题:

  1. 这些是任何接近是正确的,漂亮的,下面的好做法的解决方案?
  2. 这对lambda好用吗?任何想法如何使它更简单?
  3. 也许我应该考虑这个任务的其他类或方法?

我已经阅读了关于.parallelStream()的一部分,所以现在不要介意。

+0

三元表达式'(MyEnum.STATUS == object.getStatus)? otherList:someOtherList'可能是最简单的方法。 – chrylis

回答

3

这可以通过使用partitioningBy

Map<Boolean, List<SomeClass>> partitioned = object.getList().stream() 
    .collect(partitioningBy(listObject->MyEnum.STATUS.equals(listObject.getStatus())) 

partitioned.get(true)会给你与有状态MyEnum.STATUSpartitioned.get(false)会得到你,没对象的对象列表来实现。

+0

partitioningBy()定义在哪里?这是一个静态导入? – JustinKSU

+0

从java.util.stream.Collectors静态导入。 –