Java8:参考此匹配和映射

时间:2014-04-16 08:23:00

标签: java list java-8 java-stream

假设有一个来自类Target的对象和来自类FriendOfTarget的一组对象,例如

public class Target{

    private List<FriendOfTarget> completeListOfFriendOfTargets;

    public boolean matchSomething(FriendOfTarget fot){
        //do something by comparing the fields of Target and FriendOfTarget
    }

    public List<FriendOfTarget> reduce(){
        //
    }

}

public class FriendOfTarget{
    //
}

如果我想构建FriendOfTarget个对象的列表,在Java7中我在类reduceByParam的方法Target内执行以下操作:

public List<FriendOfTarget> reduce(){
  List<FriendOfTarget> lst= new ArrayList<>();
  for(FriendOfTarget fot: completeListOfFriendOfTargets){
    if(reduceByThis(fot))
      lst.add(fot);
  }
  return lst;
}

我如何在Java8中做同样的事情?我在查找如何将this引用到anyMatch的{​​{1}}方法时遇到了一些困难。

1 个答案:

答案 0 :(得分:2)

实现功能接口有两种方法,即 this

  • Lambda表达式:fot -> reduceByThis(fot)
  • 方法参考:this::reduceByThis

lambda表达式可以以与封闭范围相同的方式访问this。这意味着您可以在有资格和无资格的情况下调用方法reduceByThis。对于方法引用,可以显式绑定该目标对象。以下示例仅显示后者:

public List<FriendOfTarget> reduce() {
    return completeListOfFriendOfTargets
        .stream()
        .filter(this::reduceByThis)
        .collect(toList());
}

您还可以在lambda表达式中显式使用this。正如我已经提到的,它指的是封闭范围的this(与匿名内部类相反)。例如:

public List<FriendOfTarget> reduce() {
    return completeListOfFriendOfTargets
        .stream()
        .filter(fot -> fot.reduceOtherDirection(this))
        .collect(toList());
}