[英]Reduce If in Java Stream
如果謂詞為真,我該如何應用reduce操作?
例如:
Stream.of("foo=X","bar=Y","foo=Z")
.reduce((arg1, arg2)-> arg1.contains(arg2) ? arg1 : <reduceNothing>)
.collect(Collectors.toList());
我想擺脫"foo=..."
之一,最后得到一個"foo=X","bar=Y"
只需使用可以獲得第一個(在遭遇順序中)結果的合並,以防發現重復:
Collection<String> result = Stream.of("foo=X", "bar=Y", "foo=Z", "bar=M", "test=12")
.collect(Collectors.toMap(
x -> x.split("=")[0],
Function.identity(),
(left, right) -> left,
LinkedHashMap::new))
.values();
System.out.println(result); // [foo=X, bar=Y, test=12]
我已經使用LinkedHashMap
以防您需要保留初始訂單,如果您不需要,只需使用:
Collection<String> result = Stream.of("foo=X", "bar=Y", "foo=Z", "bar=M", "test=12")
.collect(Collectors.toMap(
x -> x.split("=")[0],
Function.identity(),
(left, right) -> left))
.values();
System.out.println(result); // [bar=Y, test=12, foo=X]
嘗試這個:
Stream.of("foo=X","bar=Y","foo=Z")
.collect(Collectors.toMap(
x -> getLeftSide(x),
x -> x,
(x, y) -> x
))
.values();
我假設你有getLeftSide
方法返回賦值的左側部分(將"foo=bar"
轉換為"foo"
)。
如果有靈活性可以使用除reduce之外的任何其他操作,則可以回答:
@Test
public void test(){
System.out.println(methodContainingFilteringLogic(word -> word.equals("foo=Z"),
Stream.of("foo=X","bar=Y","foo=Z")));
}
public static List<String> methodContainingFilteringLogic(Predicate<String> predicate, Stream<String> wordsStream) {
return wordsStream.filter(word -> predicate.negate().test(word))
.collect(Collectors.toList());
}
在您的情況下,將在哪個基礎上知道給定的流應該被過濾。 此時可以調用methodContainingFilteringLogic
。
這是一種方法(沒有流):
Map<String, String> map = new LinkedHashMap<>();
yourListOfArgs.forEach(arg -> map.merge(arg.split("=")[0], arg, (o, n) -> o));
Collection<String> uniqueArgs = map.values();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.