我是 Java 流的新手,但真的需要通過實踐來掌握!
集合輸入由字串組成,例如[name][dot][country],示例如下:
JAMES.BRITAIN
JOHN.BRITAIN
LEE.BRITAIN
GEORGE.FRANCE
LEON.FRANCE
MARSELLE.FRANCE
KOFI.GHANA
CHARLIE.GHANA
請問,如何在單個流陳述句中回傳唯一國家/地區串列?
預期結果將是一個不同的串列,如下所示:
BRITAIN
FRANCE
GHANA
在實際代碼中,下面的流陳述句為我提供了要過濾的串列,即:
List<String> allSolrCollections = (List<String>) findAllCollections()
.getJsonArray(SOLR_CLOUD_COLLECTION)
.getList()
.stream()
.map(object -> Objects.toString(object, null))
.collect(Collectors.toList());
uj5u.com熱心網友回復:
- 對于問題的第一部分,您需要將每個條目轉換為相應的國家/地區。因此,您可以使用
String.split功能并保留國家/地區部分。 - 對于第二部分,您可以利用
Stream.distinct從傳入流中洗掉重復項的功能。
最后,這應該作業:
List<String> res = list.stream()
.map(s -> s.split("\\.")[1])
.distinct()
.collect(Collectors.toList());
uj5u.com熱心網友回復:
替代解決方案
您可以利用該方法的優勢Pattern#splitAsStream(CharSerquence)。將每一行拆分為新 Stream 后,跳過第一項,flatMap將結果放入新 Stream 并生成Set.
final Pattern pattern = Pattern.compile("\\.");
final Set<String> result = list.stream()
.flatMap(string -> pattern.splitAsStream(string).skip(1))
.collect(Collectors.toSet());
[GHANA, FRANCE, BRITAIN]
uj5u.com熱心網友回復:
如果您想注意格式,則值得使用正則運算式。這也使代碼的含義對讀者更清楚。
Pattern inputPattern = Pattern.compile("- (?<name>[A-Z] )\\.(?<country>[A-Z] )");
list.stream()
.map(inputPattern::match)
.filter(Matcher::matches)
.map(m -> m.group("country"))
.distinct()
.toList();
這將忽略與預期格式不匹配的行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/510290.html
