我正在尝试使用java 8流。我检查了其他帖子,我不明白为什么我的代码导致错误。有人可以告诉我我的代码有什么问题吗?谢谢
private OptList myFunction(OptList childOpts, Opt subOpt) {
OptList results = new OptList();
for (Opt o : childOpts) {
if ((subOpt.getOptPri() == null || subOpt.getOptPrices().isZeroPrice())
&& (o.getOptPrices() == null || o.getOptPrices().isZeroPrice()))
{
results.add(o);
} else
if (subOpt.getOptPrices() != null && o.getOptPrices() != null) {
if (subOpt.getOptPrices().getPrice(PriceType.MS).equals(o.getOptPrices().getPrice(PriceType.MS))
&& subOpt.getOptPrices().getPrice(PriceType.DISC).equals(o.getOptPrices().getPrice(PriceType.DISC))
&& subOpt.getOptPrices().getPrice(PriceType.INV).equals(o.getOptPrices().getPrice(PriceType.INV))
&& subOpt.getOptPrices().getPrice(PriceType.INV_DISC).equals(o.getOptPrices().getPrice(PriceType.INV_DISC)))
{
results.add(o);
}
}
}
return results;
}
private OptionList myFunction(OptList childOpts,
Opt subOpt) {
return childOpts.stream()
.filter(o -> (((subOpt.getOptPrices() == null || subOpt.getOptPrices().isZeroPrice()) && (o.getOptPrices() == null || o.getOptPrices().isZeroPrice()))
|| ( (subOpt.getOptPrices() != null && o.getOptPrices() != null) && (subOpt.getOptPrices().getPrice(PriceType.MS).equals(o.getOptPrices().getPrice(PriceType.MS))
&& subOpt.getOptPrices().getPrice(PriceType.DISC).equals(o.getOptPrices().getPrice(PriceType.DISC))
&& subOpt.getOptPrices().getPrice(PriceType.INV).equals(o.getOptPrices().getPrice(PriceType.INV))
&& subOpt.getOptPrices().getPrice(PriceType.INV_DISC).equals(o.getOptPrices().getPrice(PriceType.INV_DISC))) )))
.collect(Collectors.toList());
}
答案 0 :(得分:0)
我知道你有两个功能,一个是使用常规收集操作实现的,另一个是使用流实现的,你想知道为什么第二个不起作用。
我不知道OptList
是什么,但它不会是List<Opt>
,这是collect(Collectors.toList())
将返回的内容。您需要某种方法使collect
函数返回OptList
。
您有两种选择。
如果OptList
是(扩展)Collection<Opt>
,那么您可以使用toCollection
并传递一个生成OptList的函数:
childOpts.stream(). (other stuff) .collect(Collectors.toCollection(OptList::new))
这是有效的,因为collect
方法知道如何调用生成的add
的{{1}}方法。
如果Collection
不是收藏类型,那么您仍然可以使用OptList
,但必须build your own collector。您需要提供一个创建输出类型的函数,一个向其添加新成员的函数,以及一个将两个输出类型合并为一个的函数,如果您正在收集并行流,将使用该函数。
它可能看起来像这样:
collect
如果childOpts.stream(). (other stuff) .collect(OptList::new, OptList::add, OptList::addAll)
没有OptList
,那么您可以尝试传递addAll
(不确定是否可行!)或传递抛出{{1的函数}}
答案 1 :(得分:0)
您正在使用自己的列表实施。
Collectors.toList()会返回标准集合类型:List<Opt>
。
因此,您的第一个选择是使用像
这样的标准private List<yourType> myFunction(OptList childOpts, Opt subOpt)
或如果OptionList
实施List
,那么您可以将收听电话更改为:
Collectors.toCollection(OptionList::new)
这个小例子提供了有关返回类型和标准类型的一些信息:
List<String> values = Arrays.asList("1", "2", "3");
System.out.println(
values.stream().collect(toList())
.getClass().getTypeName() );
System.out.println(
values.stream().collect(toCollection(LinkedList::new))
.getClass().getTypeName() );
打印:
java.util.ArrayList
java.util.LinkedList
答案 2 :(得分:0)
让我们看一下myFunction
方法:
private OptionList myFunction(OptList childOpts, Opt subOpt) {
return childOpts.stream()
.filter(...)
.collect(Collectors.toList());
}
它需要一个Opt
s(OptList
)列表,消除那些不符合某个条件的人,然后将它们与toList()
收集器分组,后者返回{ {1}}流式传输的项目。
因此表达式的返回类型(以及整个方法的返回类型)应该是java.util.List
或它的超类型(例如List<Opt>
)。
因此,您当前的方法签名是错误的,并且编译器会抱怨。