假设我有多个List
个不同的对象,并且我想将这些对象映射到一个int
值(例如返回String
的长度),以便执行Stream
中的操作。所以我创建了一个方法,例如:
public <T> int foo(List<T> list, ToIntFunction<T> toInt) {
return list.stream().mapToInt(toInt).max().orElse(Integer.MIN_VALUE);
}
(注意:max
可能是其他一些终端操作)
然后我想向其传递一个ToIntFunction
。我可以的:
ToIntFunction<String> length = e -> e.length();
int bar = foo(list, length);
但是,每次调用该方法时,我都必须写出ToIntFunction
。
有没有办法做类似的事情:
foo(list, new ToIntFunction<String>(e -> e.length()) );
//Obviously ToIntFunction is an interface and can't be instantiated
还是有必要使用命名变量在两行上执行此操作?
答案 0 :(得分:3)
只需像这样将其作为内联lambda传递,
foo(Arrays.asList("test"), e -> e.length());
否则,这是基于可读性更高的方法引用的方法,
foo(Arrays.asList("test"), String::length);
这里的窍门是ToIntFunction<T>
是一个抽象方法接口,该语言允许您使用lambda表达式创建这些接口的实例。
上述lambda表达式只是一种语法糖,它替代了更详细的匿名内部类。这就是Java8之前的方法。
int bar = foo(Arrays.asList("test"), new ToIntFunction<String>() {
@Override
public int applyAsInt(String value) {
return value.length();
}
});