这是java.util.stream的正确用法吗?

时间:2016-03-30 20:41:49

标签: java java-8 java-stream

更新

好的,我想我现在知道如何使用流。旧帖子中的代码是一团糟,我并不为此感到骄傲。所以,谢谢你的帮助,指导我朝着正确的方向前进。我写了一个供应商类,它为我提供了项目并使用了静态过滤器映射器功能:

final TradeSupplier tradeSupplier = new TradeSupplier();
Stream.generate(tradeSupplier).map(TradeSupplier::getPrice)
        .map(TradeSupplier::getTradePartner)
        .map(TradeSupplier::getTradeInfo)
        .filter(TradeSupplier::validateInfo)
        .map(TradeSupplier::getPartnerAssetId)
        .filter(TradeSupplier::validatePartnerAssetId).forEach(t -> {
            if (trade.sendTrade(t)) {
                tradeSupplier.finishedItem();
                TradeCache.save(t);
            }
        });

通过这种设计,我不需要flatMap,因为它只是一个接一个的映射。其他信息将记录到项目中,该项目位于流中 我希望,这段代码比下面的代码更好......你怎么看? 我很感激任何帮助,以提高我对溪流的理解:))

旧帖子

我正在为" new"寻找帮助。 java 8的流api:首先我得到一个项目列表,对于我收集字符串列表的每个项目,之后,我想将字符串与其对应的项目组合:

输入

  • ITEM1
  • ITEM2

想要输出:

  • ITEM1;字符串1
  • ITEM1;字符串2
  • ITEM2;字符串1
  • ITEM2;字符串2
  • ITEM2; STRING3

以下代码是使用此API的正确方法吗?

代码(使用流api)

// input is a list of items
analyst.getInRange(wantMinValue, wantMaxValue)
        .stream()
        .filter(i -> !haveItem.getName().contains(i.getName())
                || (!haveItem.getModel().contains(i.getModel()) && haveItem
                        .getQuality() > i.getQuality()))
// get extra information and add it to a list (key: item; value: string) 
        .collect(Collectors.toMap(s -> s, s -> lounge.getItemId(s)))
        .entrySet()
        .stream()
// delete all null and empty strings 
        .filter(e -> e.getValue() != null && !e.getValue().isEmpty())
// for every entry in list, create an list and add to result
        .forEach(
                e -> {
                    lounge.getListOfValue(e.getValue(), 1)
                            .stream()
                            .filter(s -> s != null && !s.isEmpty())
                            .map(s -> lounge.getStringFromOldString(s))
                            .filter(s -> s != null && !s.isEmpty())
                            .collect(
                                    Collectors
                                            .toCollection(HashSet::new))
// add list to resulting list
                            .forEach(
                                    s -> {
                                        result.add(new TradeLink(s,
                                                haveItem, e.getKey()));
                                    });

                });

1 个答案:

答案 0 :(得分:2)

首先:.filter(s -> s != null && !s.isEmpty())

不要包含这些内容,除非这些实际上可能发生的事情。您的应用程序中是否会出现空字符串或空字符串? (如果是这样,这可能首先反映了一个设计缺陷。让你的应用程序崩溃可能会更好,因为null通常不应该像你这样在你的程序中。)

第二:不要做你在这里做的可变事情:

      .forEach(
            e -> {
                lounge.getListOfValue(e.getValue(), 1)
                        .stream()
                        .filter(s -> s != null && !s.isEmpty())
                        .map(s -> lounge.getStringFromOldString(s))
                        .filter(s -> s != null && !s.isEmpty())
                        .collect(
                                Collectors
                                        .toCollection(HashSet::new))
                        // add list to resulting list
                        .forEach(
                                s -> {
                                    result.add(new TradeLink(s,
                                            haveItem, e.getKey()));
                                });

            });

相反,做一些事情:

  .flatMap(e ->
                lounge.getListOfValue(e.getValue(), 1)
                        .stream()
                        .map(lounge::getStringFromOldString)
                        .distinct()
                        .map(s -> new TradeLink(s, haveItem, e.getKey()))
  .collect(toList())