如何将"!= null"语句替换为方法引用?



我的intelij向我展示了我可以用方法参考替换lambda .filter(bean -> bean != null)。当我有一个方法或具有方法的对象时,这对我来说是显而易见的。但是如何在!= null上参考,是否有某种isNull()方法的类?

这是Objects::nonNull API存在的确切原因:

.filter(Objects::nonNull);

是的,当然是;您可以使用Objects::nonNull API。

package com.logicbig.example.objects;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
public class NonNullExample {
    public static void main(String... args) {
        List<String> list = Arrays.asList(null, null, "first_element", "second_element", null);
        list = list.stream().filter(Objects::nonNull).collect(Collectors.toList());
        System.out.println(list);
    }
}

从评论移至答案

当然,正如Aomine所说,您可以使用Objects::nonNull

但是对于没有可用功能的代码,我认为知道您可以在lambda表达式中使用很多东西很有用。您可以使用代码块,也可以按照lambda的合同编写一个简单的方法并传递对该方法的引用。

class Test {
    public static void main(String[] args){
        Stream<Object> stream = ...;
        // lambda from code block
        stream.filter(bean -> {return bean != null;});
        Predicate<Object> p1 = o ->  {return o != null;};
        // which resolves to the below
        Predicate<Object> p2 = new Predicate<>() {
            @Override public boolean test(Object o) {
                return o != null;
            }
        };
        // or pass your own method that can resolve to the correct functional class
        stream.filter(Test::myPredicateTest);
    }
    // meets the contract of a Predicate<Object>.test(Object o) returning boolean
    public static boolean myPredicateTest(Object o) {
        return o != null;
    }
}

最新更新