Java 8在对象的属性上传输nonNull

时间:2016-08-18 08:40:18

标签: java filter java-8 java-stream

我有以下代码段,用于收集具有name字符串属性且包含特定过滤器filterName的特定对象。

List<Foo> filteredFoo= fooList.stream()
                .filter(Objects::nonNull)
                .filter(myFoo -> {
                            if (Strings.isNullOrEmpty(myFoo.getName()))
                                return false;
                            return myFoo.getName().contains(filterName);
                        }
                ).collect(Collectors.toList());

它按预期工作但我想知道是否有更优雅的方式以函数方式编写if-statement并以比在过滤器中具有条件块更好的方式检查空或null属性。

3 个答案:

答案 0 :(得分:7)

将第二个filter替换为以下内容:

.filter(myFoo -> Optional.ofNullable(myFoo.getName())
                         .filter(n -> n.contains(filterName))
                         .isPresent())

甚至:

.filter(myFoo -> {
    String name = myFoo.getName();
    return name != null && name.contains(filterName)
 })

答案 1 :(得分:1)

为结果表达式找到函数样式:

.filter(foo -> foo.getName() != null && foo.getName().contains(filterName))

拆分不会带来更多简单:

.filter(foo -> foo.getName() != null)
.filter(foo -> foo.getName().contains(filterName))

在Foo :: getName(Objects :: isNull)上使用谓词也是无意义的复杂,只是为了备用变量。

如果filterName本身不为空,则不需要Strings.isEmptyOrNull。

答案 2 :(得分:0)

如果您有权访问Foo Class,请将if条件移至方法isSameName并使用过滤器,如下所示

filter(myFoo -> {return myFoo.isSameName(filterName);})