gpt4 book ai didi

java - 通用函数stream.map

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

我目前有一个类测试,它将流转换为相同类型的流。

class Test {
private Function<A1, A1> a1Transform;
private Function<A2, A2> a2Transform;

public <T extends A> Stream<T> transform(Stream<T> input) {
return input
.filter(o -> o instanceof A1)
.map(A1.class::cast)
.map(a1Transform);
}
}

代码不会编译,除非

  1. 我将返回类型设为 Stream<? super T>
  2. 我添加了 .map(o -> (T) o)将其转换回 T。

这两种解决方案都好吗?解决这个问题的更好方法是什么。

最佳答案

如果A1 , A2等有一个共同的父类(super class)型 A ,那么您可以将该方法更改为如下所示:

public Stream<A> transform(Stream<?> input) {
return input.filter(o -> o instanceof A1)
.map(o -> (A1) o)
.map(a1Transform)
.map(o -> (A) o);
}

方法无法返回,例如,或者 Stream<A1> Stream<A2> Stream<A3>等等。你能做的最好的事情就是像上面那样,你返回 Stream<A> ,或者您可以返回 Stream<? extends A> .

如果返回具有元素的确切类型的流确实很重要,那么您可以使用类似访问者模式的东西,并将访问者传递给方法,而不是直接返回流。

另一种可能的方法是调用者传递 Class进入方法:

public <T extends A> Stream<T> transform(Stream<?> input, Class<T> type) {
return input...
...
...
.map(type::cast);
}

但是,遇到此类问题通常表明您需要重新设计某些内容。一般来说,在面向对象的设计中,API 外部的代码不应该关心特定类型的对象。

关于java - 通用函数stream.map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49162388/

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