本文介绍Java 8/9中,通过IntStream或Stream.of实现,获取单个字符在一个字符串中出现的位置索引下标列表的方法。实现的效果:getIndexList(“Hello world!”, 'l') 方法返回字符l在Hello world!字符串中出现位置下标的列表[2, 3, 9]。

1、 使用IntStream实现的几种方法

intStream文档https://docs.oracle.com/javase/8/docs/api/java/util/stream/IntStream.html

1) IntStream.range

public static List<Integer> getIndexList(String s, char c) {
return IntStream.range(0, s.length())
.filter(index -> s.charAt(index) == c)
.boxed()
.collect(Collectors.toList());
}

2) IntStream.iterate

public static List<Integer> getIndexList(String s, char c) {
    return IntStream.iterate(s.indexOf(c), i -> s.indexOf(c, i + 1))
            .takeWhile(i -> i > -1)
            .boxed()
            .collect(Collectors.toList());
}

private static List<Integer> getIndexList(String word, char c) {
  return IntStream
          .iterate(word.indexOf(c), index -> index >= 0, index -> word.indexOf(c, index + 1))
          .boxed()
          .collect(Collectors.toList());
}

2、使用Stream.of实现

Stream.of("Hello world!")
            .map(Scanner::new)
            .flatMap(s -> s.findAll("l"))
            .map(mr -> mr.start())
            .forEach(System.out::println);