Lambda用法消除if

时间:2016-11-30 19:15:46

标签: java lambda

尝试学习有关实际lambda用法的新内容。

我有这个问题:

我有一个对象,里面有一些其他对象的列表。那些对象有MyEnum字段。我想迭代这些对象,获取该枚举的状态,然后根据我想要将对象添加到List1,如果满足条件。如果不是,我想将对象添加到List2。

基本上将列表拆分为两个具有特殊条件的不同列表。

我已经通过两种方法来实现这一目标,一种是古老的,经典的 - 每种,第二种是java 8 lambdas,我也试图学习。

我的代码:

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. 也许我应该考虑其他类或方法来完成这项任务?
  4. 我已经阅读了.parallelStream()部分,所以暂时不要介意。

1 个答案:

答案 0 :(得分: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)的对象的列表,其中会显示未包含的对象。