带有方法调用的Java 8过滤器

mal*_*jun 6 java java-8 java-stream

我正在学习Java 8 lambda和stream并尝试一些例子.但面临问题.这是我的代码

fillUpdate(Person p){
    List<Address> notes = getAddress();
    notes.stream().filter( addr -> addr !=null).map( this::preparePersonInfo,p,addr);
}
private void preparePersonInfo(Person p, Address addr){
    // do some stuff
}
Run Code Online (Sandbox Code Playgroud)

我在.map addr(第二个参数)字段中遇到编译错误.它有什么问题,请你提供学习java 8流的链接.仅供参考此链接Java 8 lambda

Era*_*ran 5

第一个问题是map方法调用不声明addr变量.

第二个问题是使用没有返回类型的方法map.

您不能以try(map( this::preparePersonInfo,p,addr))的方式使用方法引用,因为方法引用的参数是隐式传递的.如果preparePersonInfo只需要一个Address参数,你可以写:

notes.stream().filter( addr -> addr !=null).forEach(this::preparePersonInfo);
Run Code Online (Sandbox Code Playgroud)

因为在这种情况下,Address参数将从Stream传递.

您可能希望向Stream管道添加一些终端操作,否则它将不会被处理.由于您preparePersonInfo没有返回任何内容,因此无法使用map(map将Stream元素映射到其他内容,因此必须返回一些内容).forEach如果您想要的只是对通过过滤器的Stream的每个元素执行操作,可能会满足您的需求.

因此,以下内容应与您当前的preparePersonInfo方法一起使用:

notes.stream().filter( addr -> addr !=null).forEach (addr -> preparePersonInfo(p,addr));
Run Code Online (Sandbox Code Playgroud)

  • 如果OP真的希望使用方法引用,`filter(addr - > addr!= null)`可以替换为`filter(```Objects :: nonNull`](http://docs.oracle.com /javase/8/docs/api/java/util/Objects.html#nonNull-java.lang.Object-)`)`... (8认同)