gpt4 book ai didi

java - 在字符串上应用 JDK 8 消费者

转载 作者:搜寻专家 更新时间:2023-10-30 21:05:13 27 4
gpt4 key购买 nike

我有一个关于 Java 8 的问题。这是我的源代码:

final Consumer<String> d = e -> System.out.println(e);
final Function<String, String> upper = x -> x.toUpperCase();
final Function<String, String> lower = x -> x.toLowerCase();

new Thread(() -> d.accept(upper.apply("hello 1"))).run();
new Thread(() -> d.accept(lower.apply("hello 2"))).run();

这工作得很好并产生以下输出:

HELLO 1
hello 2

我现在的问题是 d.acceptupper.apply 上面的语法是否是唯一可能的语法,或者是否有更多的“java 8 lambda”风格我们可以写最后两行。

最佳答案

在谈论 lambda 表达式或函数式接口(interface)之前,我们必须先谈谈您真正有问题的错误:您正在调用 run() 在一个线程上! 如果你想启动一个新线程,你必须在 Thread 实例上调用 start(),如果你想顺序运行代码,不要不要创建一个 Thread(而只是一个 Runnable)。

也就是说,在 Java 8 的功能接口(interface)上有一些默认方法用于组合功能,例如你可以通过 Function.andThen(…) 链接两个 Function但可用的组合还远未完成。

如果某个组合任务在您的应用程序中重复出现,您可以考虑创建实用方法:

public static <T> Runnable bind(T value, Consumer<T> c) {
return ()->c.accept(value);
}
public static <T,U> Consumer<U> compose(Function<U,T> f, Consumer<? super T> c) {
return u->c.accept(f.apply(u));
}

new Thread(bind("Hello 1", compose(upper, d))).start();
new Thread(bind("Hello 2", compose(lower, d))).start();

但这三个部分看起来更像是流 API 的任务:

Stream.of("Hello 1").map(upper).forEach(d);
Stream.of("Hello 2").map(lower).forEach(d);

我在这里留下了新线程的创建,因为它无论如何都没有任何好处。

如果你真的想要并行处理,你可以在每个字符的基础上进行:

"Hello 1".chars().parallel()
.map(Character::toUpperCase).forEachOrdered(c->System.out.print((char)c));

但鉴于任务的简单性和并行处理的固定开销,仍然不会有任何好处。

关于java - 在字符串上应用 JDK 8 消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31068203/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com