【问题标题】:Convert a String into a set<Character> using a Stream java 8使用 Stream java 8 将字符串转换为 set<Character>
【发布时间】:2019-01-31 08:59:23
【问题描述】:
private static final String ALPHABET = "abcdefghijklmnopqrstuvwxyz";
SortedSet<Character> set= new TreeSet<Character>();
for (int i = 0; i < ALPHABET.length(); i++) {
    set.add(new Character(ALPHABET.charAt(i)));
 }

我想用 Java 8 的方式转换这个 for 循环。如果使用流可能会更好。输出将是包含字符的“set”对象。

【问题讨论】:

  • new Character(…) 自 Java 5 起已过时。您可以简单地写成 set.add(ALPHABET.charAt(i));。
  • 澄清@Holger 的评论:由于autoboxing,它已过时。

标签: java collections java-8 java-stream


【解决方案1】:

String 有一个方法可以给你一个字符流。它实际上是一个IntStream,所以我们只需要将它们转换为Characters,然后将collect 转换为一个集合。

"foo".chars()
    .mapToObj(chr -> (char) chr) // autoboxed to Character
    .collect(Collectors.toSet());

如果您需要对集合进行排序,则将TreeSet::new 用作others 和shown。

【讨论】:

    【解决方案2】:
     IntStream.range(0, ALPHABET.length())
              .mapToObj(ALPHABET::charAt)
              .collect(Collectors.toCollection(TreeSet::new));
    

    【讨论】:

    • 猜你的意思是长度,而不是长度。
    【解决方案3】:

    我认为这是最简单的方法,保留使用TreeSet 的要求。请注意,无需使用 indexes 对输入字符串进行迭代,您可以直接对其字符进行迭代。

    SortedSet<Character> set =
        ALPHABET.chars()
                .mapToObj(c -> (char) c)
                .collect(Collectors.toCollection(TreeSet::new));
    

    【讨论】:

    • 您最终得到了与 Michael proposed 相同的解决方案。
    • @ETO 没关系。在我们发布答案后,我们都在编辑我们的答案。无论如何,Stack Overflow 不应该是最快回答,它是最好回答。
    • @proposed 嗯,他引用了使用 TreeSet 的建议,我解释了为什么迭代字母表更好。每个解决方案都有自己的贡献,没关系。
    猜你喜欢
    • 2013-02-26
    • 2018-08-25
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 2014-07-18
    相关资源
    最近更新 更多