3 回答

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超10個(gè)贊
為什么不使用 Stream#peek()?
.peek()這看起來(lái)像是您可能想要使用而不是地圖的示例。它專為打印而設(shè)計(jì),您無(wú)需擔(dān)心退回任何東西!
它可能看起來(lái)更像:
stream.peek(it -> System.out.println(it.length))
.peek(it -> System.out.println(it.substring(0, 2))
// presumably other functions here before collecting...
.collect(Collectors.toList());
在此處查看官方文檔:https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#peek-java.util.function.Consumer-
回到最初的問(wèn)題
為了解決您之前的問(wèn)題,您可能想要更新您的函數(shù),以便它采用 T 的純示例和 T 的轉(zhuǎn)換。您可以將其更新為如下所示:
public static <T, R> T logger(T t, Function<T, R> transform) {
R logLine = transform.apply(t);
System.out.println(logLine);
return t;
}
你的代碼看起來(lái)像
stream.map(element -> logger(element, element::length)) // and so on

TA貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個(gè)贊
我在這里面臨的問(wèn)題是第一個(gè)地圖返回一個(gè)整數(shù),所以你試圖使用Integer.substring不存在的。
我在你的情況下推薦的是使用peek而不是map https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#peek-java.util.function.Consumer-
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class InferType {
public static void main(String[] args) {
Stream<String> stream = Stream.of("A", "BC", "XYZ");
stream.peek(t -> logger(t.length()))
.peek(t-> logger(t.substring(0, 2)))
.collect(Collectors.toList());
}
public static <T> void logger(T t) {
System.out.println(t);
}
}

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊
這對(duì)我有用
import java.util.stream.*;
class Main {
? public static void main(String[] args) {
? ? Stream<String> stream = Stream.of("AX", "BC", "XYZ");
? ? stream.map(t -> logger(t))
? ? ? .map(t-> logger(t.substring(0, 1)))
? ? ? .collect(Collectors.toList());
? ? /* or this
? ? stream.map(t -> logger(t))
? ? ? .collect(Collectors.toList());
? ? */
? }
public static <T> T logger(T t) {
? ? System.out.println(t);
? ? return t;
? }
}
在此處查看 stream() map() 的真正作用。但基本上,它說(shuō)
Stream map(Function mapper) 返回一個(gè)流,該流由將 > 給定函數(shù)應(yīng)用于此流的元素的結(jié)果組成。
添加回答
舉報(bào)