java 8 幕后方法参考
java 8 method reference behind the scene
我的问题是 lambda,方法引用都是关于功能接口的。他们只是提供它们的实现。
现在当我写的时候:
class Apple{
private int weight;
private String color;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}}
如果我写:
Function<Apple, Integer> getWeight = Apple::getWeight;
或
appleList.stream().map(Apple::getColor).collect(toList());
它实际上是如何工作的我的 getter 没有采用 Apple 的任何参数?因为根据函数功能接口
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);}
它需要一个参数和 return 一些东西,它应该可以正常工作
当 getter 是这样的:
public int getWeight(Apple a) {
return a.weight;
}
我有点困惑提前谢谢
不要将这样的 Function<Apple, Integer>
与 Apple
的实例混淆。
还记得学校的功能吗?
您必须从域中取出一个元素(这里是 Apple
s 中的一个苹果),它将与 codomain 中的一个对应元素恰好匹配(这里是 Integer
s 中的整数)。 Function
本身没有分配给任何特定的苹果。
你可以这样使用它:
List<Apple> apples = new ArrayList<Apple>();
apples.add(new Apple(120, "red"));
apples.add(new Apple(150, "green"));
apples.add(new Apple(150, "yellow"));
List<String> colors = apples.stream()
.map(Apple::getColor)
.collect(Collectors.toList());
System.out.println(colors);
Apple::getColor
相当于一个Function<Apple, String>
,每个苹果的returns颜色:
Function<Apple, Integer> getColor = new Function<Apple, Integer>() {
@Override
public Integer apply(Apple apple) {
return apple.getColor();
}
};
此外
List<String> colors = apples.stream()
.map(Apple::getColor)
.collect(Collectors.toList());
相当于:
List<String> colors = apples.stream()
.map(apple -> apple.getColor())
.collect(Collectors.toList());
这在教程 Method reference 中清楚地记录为 对特定类型的任意对象的实例方法的引用。由于对象具有引用方法类型的类型,因此该对象将是调用方法的对象。意思是:
map( Apple::getColor )
相当于:
map( a -> a.getColor() )
我的问题是 lambda,方法引用都是关于功能接口的。他们只是提供它们的实现。
现在当我写的时候:
class Apple{
private int weight;
private String color;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}}
如果我写:
Function<Apple, Integer> getWeight = Apple::getWeight;
或
appleList.stream().map(Apple::getColor).collect(toList());
它实际上是如何工作的我的 getter 没有采用 Apple 的任何参数?因为根据函数功能接口
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);}
它需要一个参数和 return 一些东西,它应该可以正常工作 当 getter 是这样的:
public int getWeight(Apple a) {
return a.weight;
}
我有点困惑提前谢谢
不要将这样的 Function<Apple, Integer>
与 Apple
的实例混淆。
还记得学校的功能吗?
您必须从域中取出一个元素(这里是 Apple
s 中的一个苹果),它将与 codomain 中的一个对应元素恰好匹配(这里是 Integer
s 中的整数)。 Function
本身没有分配给任何特定的苹果。
你可以这样使用它:
List<Apple> apples = new ArrayList<Apple>();
apples.add(new Apple(120, "red"));
apples.add(new Apple(150, "green"));
apples.add(new Apple(150, "yellow"));
List<String> colors = apples.stream()
.map(Apple::getColor)
.collect(Collectors.toList());
System.out.println(colors);
Apple::getColor
相当于一个Function<Apple, String>
,每个苹果的returns颜色:
Function<Apple, Integer> getColor = new Function<Apple, Integer>() {
@Override
public Integer apply(Apple apple) {
return apple.getColor();
}
};
此外
List<String> colors = apples.stream()
.map(Apple::getColor)
.collect(Collectors.toList());
相当于:
List<String> colors = apples.stream()
.map(apple -> apple.getColor())
.collect(Collectors.toList());
这在教程 Method reference 中清楚地记录为 对特定类型的任意对象的实例方法的引用。由于对象具有引用方法类型的类型,因此该对象将是调用方法的对象。意思是:
map( Apple::getColor )
相当于:
map( a -> a.getColor() )