一行将通用ToIntFunction传递给方法

时间:2019-01-20 02:38:57

标签: java java-8

假设我有多个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 

还是有必要使用命名变量在两行上执行此操作?

1 个答案:

答案 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();
    }
});