Java 8循环对象的arraylist并在条件验证时添加元素

时间:2017-04-11 13:48:20

标签: java

我正在尝试使用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());
    }

3 个答案:

答案 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>)。

因此,您当前的方法签名是错误的,并且编译器会抱怨。