关于Java Stream的总结

我觉得Stream很方便,所以我想把它们整理在一起。

创建流

需要通过适当的教育和培训来培养孩子们的创造力和创新能力。

返回Stream。
还可以对元素进行类型指定。

// 直接作成
Stream stream = Stream.of("a", "b", "c", "d", "e");
IntStream intStream = IntStream.of(1, 2, 3, 4, 5);
DoubleStream doubleStream = DoubleStream.of(1.0, 2.0, 3.0, 4.0, 5.0);
LongStream longStream = LongStream.of(1, 2, 3, 4, 5);

转换

将主要类型转换为流。

// Listから変換
List<String> list = Arrays.asList("a", "b", "c", "d", "e");
Stream listStrem = list.stream();

// Mapから変換
Map<Integer, String> map = new HashMap<>();
map.put(1, "A");
map.put(2, "B");
map.put(3, "C");
Stream<Map.Entry<Integer, String>> mapStream = map.entrySet().stream();

// 文字列から変換
String str = "ABCDE";
IntStream strStream = str.chars();

建筑师

返回 Stream 的构建器。

Stream.Builder<Integer> sb = Stream.builder();
sb.add(10);
sb.add(20);
Stream<Integer> buildStream =sb.build();
buildStream.forEach(System.out::println);
10
20

产生

返回一个无序的无限顺序流。

Stream<Integer> stream = Stream.generate(() -> 1);
stream.limit(3).forEach(System.out::println);
1
1
1

需要在生成随机值的情况下使用。
示例:返回0〜9之间的5个随机值。

Stream.generate(Math::random).limit(5).map(s -> Math.floor(s * 10)).mapToInt(Double::intValue).forEach(System.out::println);
2
2
9
6
8

迭代

返回一个有序的无限顺序流。

Stream<Integer> stream = Stream.iterate(1, x -> x * 2);
        stream.limit(5).forEach(System.out::println);
1
2
4
8
16

连接

合并流。

Stream<String> stream1 = Stream.of("a", "b");
Stream<String> stream2 = Stream.of("c", "d", "e");
Stream.concat(stream1,stream2).forEach(System.out::println);
a
b
c
d
e

空的 de)

创建一个空的Stream。

Stream<?> emptyList =  Stream.empty();
emptyList.forEach(System.out::println);
No OutPut

获取要素

使用Lambda表达式和方法引用可以写得更简洁。对于字符串,由于返回类型是IntStream类型,所以需要使用mapToObj方法进行类型转换。


        // Stream型
        // ラムダ式
        Stream.of("a", "b", "c", "d", "e").forEach(s -> System.out.println(s));
        // メソッド参照
        Stream.of("a", "b", "c", "d", "e").forEach(System.out::println);

        //List
        Arrays.asList(1, 2, 3, 4, 5).stream().forEach(System.out::println);

        //Map
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "A");
        map.put(2, "B");
        map.put(3, "C");
        map.entrySet().stream().forEach(s -> System.out.println("key: " + s.getKey() + " value: " + s.getValue()));

        //文字列
        String str = "ABCDE";
        str.chars().mapToObj(s -> (char)s)
                .forEach(System.out::println);

数值范围 –

范围

// 末尾を含まない
IntStream.range(1,5).forEach(System.out::println);
1
2
3
4

闭区间

// 末尾を含む
IntStream.rangeClosed(1,5).forEach(System.out::println);
1
2
3
4
5

操作進展

转变要素

地图

可以使用Lambda编写处理代码。

Stream.of(1, 2, 3, 4, 5).map(s -> s * 2).forEach(System.out::println);
2
4
6
8
10

转为整数地映射

mapToLong和mapToDouble的用法相同。

Stream.of("1", "2", "3", "4", "5")  // Stream<String>
        .mapToInt(s -> Integer.parseInt(s)) // IntStream
        .map(s -> s * 2)
        .forEach(System.out::println);
2
4
6
8
10

flatMap 扁平化

可以进行1对N的转换。

// flatMap
Stream<String> stream1 = Stream.of("A", "BB", "CCC", "DDDD", "EEEEE");
stream1.flatMap(s -> Stream.of(s, s.length(), s.toLowerCase())).forEach(System.out::print);
A1aBB2bbCCC3cccDDDD4ddddEEEEE5eeeee

精简要素

过滤

Stream.of(10, 20, 30, 40, 50).filter(s -> s <= 30).forEach(System.out::println);
10
20
30

跳过和限制

跳过 guò)

Stream.of(10, 20, 30, 40, 50).skip(2).forEach(System.out::println);
30
40
50

限制

Stream.of(10, 20, 30, 40, 50).limit(2).forEach(System.out::println);
10
20

通过组合使用“跳过”和“限制”来指定范围。

Stream.of(10, 20, 30, 40, 50).skip(2).limit(2).forEach(System.out::println);
30
40

独特的

去除重复项。

Stream.of("A", "A", "B", "B", "B", "C").distinct().forEach(System.out::println);
A
B
C

重新排列要素

分类整理

// sorted
Stream.of(13, 52, 34, 6, 28).sorted((s1, s2) -> s1 - s2).forEach(System.out::println);
// Comparatorオブジェクトを使用
Stream.of(13, 52, 34, 6, 28).sorted(Comparator.comparingInt(s -> s)).forEach(System.out::println);
6
13
28
34
52

调试

偷看

用于调试输出的方法。对于流不产生任何影响。

List<String> numbers =  Stream.of("one", "two", "three", "four")
                        .filter(e -> e.length() > 3)
                        .peek(e -> System.out.println("Filtered value: " + e))
                        .map(String::toUpperCase)
                        .peek(e -> System.out.println("Mapped value: " + e))
                        .collect(Collectors.toList());
Filtered value: three
Mapped value: THREE
Filtered value: four
Mapped value: FOUR

终端操作

输出结果

对于每一个元素进行遍历

可以进行重复处理。可以使用Lambda表达式来编写操作。

我尝试写了下面的示例,但是可以用map来重新编写它…。

Stream.of(10, 20, 30, 40 ,50).forEach(s -> {
    int intResult = s / 10;
    System.out.println(intResult);
});

逐个顺序执行

使用parallelStream()可以并行处理流。这样可以保证按照顺序输出数据。而使用forEach会以随机顺序输出数据。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
System.out.println("--------forEach---------");
list.parallelStream().filter(s -> s > 1).forEach(System.out::println);
System.out.println("--------forEachOrdered---------");
list.parallelStream().filter(s -> s > 1).forEachOrdered(System.out::println);

forEach与forEachOrdered的不同在于,forEach是随机输出,而forEachOrdered是按照列表的顺序输出。

--------forEach---------
3
5
4
2
--------forEachOrdered---------
2
3
4
5

提取结果 (extract results)

收集

以各种不同的类型返回结果。

列出

// list型で返却
List<String> list = Stream.of("A", "B", "C", "D", "E").collect(Collectors.toList());
System.out.println(list);
[A, B, C, D, E]

字符串

//String型で返却
String join1 = Stream.of("A", "B", "C", "D", "E").collect(Collectors.joining());
System.out.println(join1);

String join2 = Stream.of("A", "B", "C", "D", "E").collect(Collectors.joining(","));
System.out.println(join2);
ABCDE
A,B,C,D,E

地图 (dì tú)

可以通过Map返回已进行Group化的内容。

//最低限のモデルクラス
public class Score {
    private String name;
    private int score;

    public Score(String name, int score){
        this.name = name;
        this.score = score;
    }

    public String getName() {
        return name;
    }

    public int getScore() {
        return score;
    }
}
// scoreListを作成
List<Score> scoreList = new ArrayList<>();
scoreList.add(new Score("Tanaka", 90));
scoreList.add(new Score("Suzuki", 80));
scoreList.add(new Score("Nakamura", 100));
scoreList.add(new Score("Ito", 90));
scoreList.add(new Score("Hamanaka", 100));
//グループ分け
Map<Integer, List<Score>> map = scoreList.stream().collect(Collectors.groupingBy(Score::getScore));
//Mapの要素を出力
map.entrySet().stream().forEach(s -> System.out.println("Key: " + s.getKey() + ", Value:" + s.getValue()));
//scoreが100点のスコアデータを表示
List<Score> score100 = map.get(100);
score100.forEach(s -> System.out.println("name: " + s.getName() + ", score: " + s.getScore()));

返回的Map已经分组,并且相应值的Stream已被列为列表。

# Mapの要素を出力
Key: 80, Value:[com.example.javalearn.qiita.stream.Score@446cdf90]
Key: 100, Value:[com.example.javalearn.qiita.stream.Score@799f7e29, com.example.javalearn.qiita.stream.Score@4b85612c]
Key: 90, Value:[com.example.javalearn.qiita.stream.Score@277050dc, com.example.javalearn.qiita.stream.Score@5c29bfd]
# scoreが100点のスコアデータを表示
name: Nakamura, score: 100
name: Hamanaka, score: 100

将其转换为数组

将流(stream)转换为数组。

String[] toArray = Stream.of("a", "b", "c", "d", "e").toArray(String[]::new);
for(String s:toArray){
    System.out.println(s);
}
a
b
c
d
e

减少

累积结果。

int total = Stream.of(1, 2, 3, 4, 5).reduce((a,b) -> a + b).get();
System.out.println(total);

//メソッド参照も可能
int total1 = Stream.of(1, 2, 3, 4, 5).reduce(Integer::sum).get();

作为正在进行的事情,可以列举以下内容。

1 + 2 = 3
3 + 3 = 6
6 + 4 = 10
10 + 5 = 15
15

筛选结果

找到第一个

取出列表的第一个元素。

String findFirst = Stream.of("A", "B", "C", "D", "E").findFirst().orElse("null");
System.out.println(findFirst);
A

最大

Integer max = Stream.of(1, 2, 3, 4, 5).max(Comparator.naturalOrder()).orElse(0);
System.out.println(max);
5

翻译:敏

Integer min = Stream.of(1, 2, 3, 4, 5).min(Comparator.naturalOrder()).orElse(0);
System.out.println(min);
1

求和

Integer sum = IntStream.of(1, 2, 3, 4, 5).sum();
System.out.println(sum);
15

统计

Long count = Stream.of(1, 2, 3, 4, 5).count();
System.out.println(count);
5

平均

Double average = IntStream.of(1, 2, 3, 4, 5).average().orElse(0);
System.out.println(average);
3.0

搜索结果

任何匹配

部分相符

Boolean anyMatch1 = Stream.of(1, 2, 3, 4, 5).anyMatch(s -> s > 2);
Boolean anyMatch2 = Stream.of(1, 2, 3, 4, 5).anyMatch(s -> s < 0);
System.out.println(anyMatch1);
System.out.println(anyMatch2);
true
false

全匹配

完全相同

Boolean allMatch1 = Stream.of("one", "two", "three", "four").allMatch(s -> s.length() <= 5);
Boolean allMatch2 = Stream.of("one", "two", "three", "four").allMatch(s -> s.length() <= 4);
System.out.println(allMatch1);
System.out.println(allMatch2);
true
false

noneMatch – 没有匹配

完全不同意 规模完全不一样 完全不相符 完全不吻合 全然不相同 完全不相似

Boolean noneMatch1 = Stream.of("one", "two", "three", "four").noneMatch(s -> s.length() <= 2);
Boolean noneMatch2 = Stream.of("one", "two", "three", "four").noneMatch(s -> s.length() <= 4);
System.out.println(noneMatch1);
System.out.println(noneMatch2);
true
false

请您查阅

流(Java平台SE8)

广告
将在 10 秒后关闭
bannerAds