功能界面的隐式演员

时间:2016-03-07 14:11:00

标签: java functional-programming

我想隐式地将我自己的接口实现转换为Java8函数。

我的代码:

import java.util.stream.Stream;

@FunctionalInterface
interface StringChanger {
    String change(String o);
}

public class A {

    public static void main(String[] args) {
        Stream.of("hello", "world")
                .map(new StringChanger() {

                    @Override
                    public String change(String o) {
                        return o.trim();
                    }
                })
                .forEach(System.out::println);
    }
}

为什么演员不起作用?

我得到了这个例外:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The method map(Function<? super String,? extends R>) in the type Stream<String> is not applicable for the arguments (Trimmer)

    at A.main(A.java:13)

1 个答案:

答案 0 :(得分:0)

好吧,map方法并不期望实现StringChanger。它期望实现Function

您可以做的是创建StringChanger界面的实现,并将实施的方法参考传递给map

 StringChanger sc = new StringChanger() {
     @Override
     public String change(String o) {
         return o.trim();
     }
 };
 Stream.of("hello", "world")
       .map(sc::change)
       .forEach(System.out::println);

编辑:

为了将一个功能接口的实现分配给不同的功能接口引用,您可以为源功能接口的方法分配方法引用:

    MyConsumer i3 = i::accept;
    IntConsumer i4 = i2::doSomething;
相关问题