簡體   English   中英

如何在 Java 8 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM