好的,我想我现在知道如何使用流。旧帖子中的代码是一团糟,我并不为此感到骄傲。所以,谢谢你的帮助,指导我朝着正确的方向前进。我写了一个供应商类,它为我提供了项目并使用了静态过滤器和映射器功能:
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:首先我得到一个项目列表,对于我收集字符串列表的每个项目,之后,我想将字符串与其对应的项目组合:
以下代码是使用此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()));
});
});
答案 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())