![](/img/trans.png)
[英]Convert List of Objects to List of String with filter using Java Streams
[英]How to filter a list of String down to a distinct list made of string suffices in Java 8 Streams
我是 Java 流的新手,但真的需要通過實踐來掌握!
集合輸入由字符串組成,例如 [name][dot][country],示例如下:
- JAMES.BRITAIN
- JOHN.BRITAIN
- LEE.BRITAIN
- GEORGE.FRANCE
- LEON.FRANCE
- MARSELLE.FRANCE
- KOFI.GHANA
- CHARLIE.GHANA
請問,如何在單個 stream 語句中返回唯一國家/地區列表?
預期結果將是一個不同的列表,如下所示:
- BRITAIN
- FRANCE
- GHANA
在實際代碼中,下面的流語句為我提供了要過濾的列表,即:
List<String> allSolrCollections = (List<String>) findAllCollections()
.getJsonArray(SOLR_CLOUD_COLLECTION)
.getList()
.stream()
.map(object -> Objects.toString(object, null))
.collect(Collectors.toList());
String.split
function 並保留國家/地區部分。Stream.distinct
function 將從傳入的 stream 中刪除重復項。最后,這應該工作:
List<String> res = list.stream()
.map(s -> s.split("\\.")[1])
.distinct()
.collect(Collectors.toList());
如果您想注意格式,則值得使用正則表達式。 這也使代碼的含義對讀者更清楚。
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();
這將忽略與預期格式不匹配的行。
替代解決方案
您可以使用Pattern#splitAsStream(CharSerquence)
方法的優勢。 將每一行拆分為新的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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.