Java 8中特殊lambda表达式的最短表示法

时间:2016-02-01 20:07:18

标签: java lambda java-8

我是Java 8的新手,并且正在搞乱一点。

现在我在Java 8中尝试了函数接口ConsumerandThen方法:

public static void main(String[] args) {
    List<Integer> ints = new ArrayList<Integer>();
    for (int i = 0; i < 5; i++) {
        ints.add(i);
    }
    Consumer<Integer> cons1 = in -> System.out.println("--> " + in);
    ints.forEach(cons1.andThen(in -> System.out.println("-+---> " + in)));
}

工作正常!输出是:

--> 0
-+---> 0
--> 1
-+---> 1
--> 2
-+---> 2
--> 3
-+---> 3
--> 4
-+---> 4

现在,我问自己是否可以连接两个消费者(使用andThen方法)而不为第一个消费者cons1创建自己的对象?

3 个答案:

答案 0 :(得分:8)

是的,但它比直截了当的方式更加混乱。

可以

ints.forEach(
   ((Consumer<Integer>) in -> System.out.println("--> " + in))
       .andThen(in -> System.out.println("-+---> " + in)));

但是编写

要好得多
ints.forEach(in -> {
  System.out.println("--> " + in);
  System.out.println("-+---> " + in);
});

答案 1 :(得分:2)

您可以使用Louis Wasserman答案中的演员表。

“问题”是lambda表达式can only appear in three different context:赋值上下文,强制转换上下文和调用上下文。在您的示例中,您正在使用赋值上下文来创建该lambda表达式。

能够编写(a -> b).andThen(c -> d)会很高兴但不幸的是,lambda表达式不能出现在那个上下文中......你可以做的是通过将消费者分解成特定的方法来创建一个调用上下文。您甚至可以通过添加泛型类型使它们成为通用的。

public static void main(String[] args) {
    List<Integer> ints = new ArrayList<Integer>();
    for (int i = 0; i < 5; i++) {
        ints.add(i);
    }
    ints.forEach(printFirst().andThen(printSecond()));
}

private static <T> Consumer<? super T> printFirst() {
    return in -> System.out.println("--> " + in);
}

private static <T> Consumer<? super T> printSecond() {
    return in -> System.out.println("-+---> " + in);
}

答案 2 :(得分:1)

作为@Tunaki答案的附录,您还可以创建一个静态方法,接受然后返回<T> Consumer<? super T>以模拟具有调用上下文的转换上下文:

public static void main(String... args) {
    List<Integer> ints = new ArrayList<Integer>();
    for (int i = 0; i < 5; i++) {
        ints.add(i);
    }
    ints.forEach(
        consumer(in -> System.out.println("--> " + in))
          .andThen(in -> System.out.println("-+---> " + in))
    );
}

private static <T> Consumer<? super T> consumer(Consumer<? super T> consumer) {
    return consumer;
}