gpt4 book ai didi

java - 如何编写自定义流函数

转载 作者:行者123 更新时间:2023-11-30 06:46:06 28 4
gpt4 key购买 nike

我知道基本的流函数,例如:

mystream.filter(something).map(something)

有没有办法让我编写自己的函数来应用于流,例如:

mystream.something()

链接必须能够像 etc. 一样继续:

mystream.something().map()

最佳答案

您必须实现自己的库,它包装了已经存在的 Stream与您自己的接口(interface):

interface CustomStream<T> extends Stream<T> {
CustomStream<T> something();
}

这样你就必须获得 Stream<T> 的一个实例然后将其包装到您自己的实现中 interface :

class CustomStreamImpl<T> implements CustomStream<T>{
private final Stream<T> stream;

public CustomStreamImpl(Stream<T> stream){
this.stream = stream;
}

public CustomStreamImpl<T> something(){
// your action below
Stream<T> newStream = stream
.filter(o -> o != null)
.collect(Collectors.toList())
.stream();
return new CustomStreamImpl<T>(newStream);
}

// delegate all the other methods to private stream instance
}

有了上面你就可以创建一个CustomStream像下面这样:

CustomStream<String> stream = new CustomStreamImpl<>(Stream.of("Hello", "World"));

唯一不好的是所有继承自Stream的方法将返回 Stream<T> 的实例而不是 CustomStream<T> 之一.

CustomStream<String> stream = new CustomStreamImpl<>(Stream.of("Hello", "World"));
// returns not CustomStream
Stream<String> newStream = stream.filter(s -> s.equals("Hello"));

因此,一旦您使用来自已给定 API 的方法,您将“丢失”您的 customStream。要克服这个问题,您必须重写界面中的方法:

interface CustomStream<T> extends Stream<T> {
CustomStream<T> something();

CustomStream<T> filter(Predicate<? super T> tester);
// all the other methods
}

然后始终创建 CustomStream<T> 的新实例当原始方法Stream<T> API 调用:

public CustomStreamImpl<T> filter(Predicate<? super T> tester){
return new CustomStreamImpl<T>(stream.filter(tester));
}

最后你能够实现你的目标:

CustomStream<String> stream = new CustomStreamImpl<>(Stream.of("Hello", "World"));
stream
.filter(s -> s.equals("Hello"))
.something()
.map(String::length)
.something()
.forEach(System.out::println);

我希望这能让您深入了解如何解决您的问题

关于java - 如何编写自定义流函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48010544/

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