这是java.util.stream的正确用法吗? 使现代化

这是java.util.stream的正确用法吗? 使现代化,java,java-8,java-stream,Java,Java 8,Java Stream,好的,我想我现在知道如何使用流了。旧帖子里的代码乱七八糟,我对此并不自豪。所以,谢谢你的帮助,为我指引了正确的方向。我编写了一个supplier类,它为我提供了项目,并使用了静态过滤器和映射器函数: final TradeSupplier tradeSupplier = new TradeSupplier(); Stream.generate(tradeSupplier).map(TradeSupplier::getPrice) .map(TradeSupplier::getTr

好的,我想我现在知道如何使用流了。旧帖子里的代码乱七八糟,我对此并不自豪。所以,谢谢你的帮助,为我指引了正确的方向。我编写了一个supplier类,它为我提供了项目,并使用了静态过滤器和映射器函数:

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
,因为它只是一个一个映射。附加信息被归档到项目中,该项目就在流中 我希望,这个代码比下面的代码好。。。你怎么认为? 我非常感谢任何有助于提高我对流的理解的帮助:)


旧职位 我正在寻找java 8的“新”流api的帮助:首先,我得到一个项目列表,对于每个项目,我收集一个字符串列表,然后,我想将字符串与其对应的项目组合起来:

输入:
  • 项目1
  • 项目2
想要的输出:
  • 项目1;string1
  • 项目1;string2
  • 项目2;string1
  • 项目2;string2
  • 项目2;弦3
以下代码是使用此api的正确方法吗

代码(带有流api) 首先:
.filter(s->s!=null&&!s.isEmpty())

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

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

      .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())

哦,天哪,这看起来一点都不漂亮。请发一封信。具有预期的输入/输出。`.filter(e->e.getValue()!=null&&!e.getValue().isEmpty())`这真的会发生吗?@LouisWasserman是的,这是可能的。不,这不是使用API的正确方法。流应该增加可读性,而不是混淆代码。考虑编写一些静态或实例方法来替换多语句LAMBDA块,并按名称引用它们。以这种方式使用时,
API可以简洁、清晰地表达您的意图。
  .flatMap(e ->
                lounge.getListOfValue(e.getValue(), 1)
                        .stream()
                        .map(lounge::getStringFromOldString)
                        .distinct()
                        .map(s -> new TradeLink(s, haveItem, e.getKey()))
  .collect(toList())