Java 8 IntStream的工作实例

658 阅读6分钟

一个快速指南,以了解作为支持整数操作的接口IntStream的原始int表示,并附有有用的例子。

1.概述

在本教程中,我们将学习如何在java 8中使用IntStream,以及它在实例程序中的应用。

对于int基元,Java IntStream类是Stream接口的一个特殊化。它是一个原始int值项目的流,可以用于顺序和并行的聚合操作。

AutoCloseable和BaseStream接口是由IntStream实现的,它是java.util.stream包的一部分。

我们将在本课程中学习以下内容。

  • 创建IntStream
  • ForEach循环
  • IntStream的范围
  • IntStream最小和最大
  • IntStream查找
  • IntStrem map
  • 筛选
  • IntStream distinct
  • IntStream到数组
  • IntStream to List

2.创建IntStream

IntStream可以通过多种方式生成,但不能用new关键字来创建。

IntStream对象是用下面列出的方法创建的。

  • IntStream.of()
  • IntStream.range()
  • IntStream.rangeclosed()
  • IntStream.generate()
  • IntStream.iterate()

让我们通过实例程序来探索使用这些方法的方法。 创建一个具有原始int值的IntStream实例。

2.1 IntStream.of()

这个函数返回一个以所提供的值为元素的顺序排列的流。

它有两种形式:单元素流和多值流。

IntStream of(int t) - 返回一个由单一元素组成的流。

IntStream of(int... values)- 返回一个包含所有提供的元素的流。

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

package com.javaprogramto.java8.intstream;

import java.util.stream.IntStream;

public class IntStreamOf {

    public static void main(String[] args) {

        IntStream singleValue = IntStream.of(10);

        IntStream multipleValeus = IntStream.of(1, 5, 10, 20, 30);

    }

}

2.2 IntStream.range()

range() 用于按顺序生成数字,并以1为单位递增

static IntStream range(int startInclusive, int endExclusive) - 这里的结束范围是独占的。

1

IntStream range10to30 = IntStream.range(10, 20);

2.3 IntStream.rangeclosed()

**rangeClosed()**也用于以逐一递增的方式产生数字,但它包括此方法的结束索引。

静态IntStream rangeClosed(int startInclusive, int endInclusive)

1

IntStream range10to15closed = IntStream.range(10, 15);

2.4 IntStream.generate()

如果你想用自定义逻辑生成随机数,请使用generate()方法。

1

IntStream random = IntStream.generate( () -> { return (int) Math.random() * 5000;});

2.5 IntStream.iterate()

iterate()方法与generate()方法相同,只是它不使用随机值,而是对大数值使用递增或递减的自定义逻辑。

由于iterate()方法生成的是一个无限的整数流,你必须使用limit()函数来获得前n个数字。

1

IntStream iterate = IntStream.iterate(1000, i -> i + 4000).limit(5);

3.IntStream forEach()

通常情况下,我们可以使用传统的for循环来处理某些范围。然而,同样的事情也可以通过使用**IntStream.forEach()**函数来代替完成。

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

package com.javaprogramto.java8.intstream;

import java.util.stream.IntStream;

public class IntStreamOf {

    public static void main(String[] args) {

        System.out.println("for loop");

        for(int i = 1000; i < 20000 ; i = i + 4000) {

            print(i);

        }

        System.out.println("intstream foreach loop");

        IntStream iterate = IntStream.iterate(1000, i -> i + 4000).limit(5);

        iterate.forEach(n -> print(n));

    }

    private static void print(int n) {

        System.out.println(n);

    }

}

4.IntStream范围

IntStream API提供了两种方法来处理在定义范围内生成的数字。

range(start, endExclusive): 从输出范围中排除末端索引。

rangeClosed(start, endInclusive): 这个方法包括输出范围的结束指数。

下面的程序输出让你清楚地了解range()和rangeClosed()方法。

1

2

3

4

5

IntStream range10to15range = IntStream.range(10, 15);

        IntStream range10to15closed = IntStream.rangeClosed(10, 15);

        System.out.println("range(10, 15) : "+Arrays.toString(range10to15range.toArray()));

        System.out.println("rangeClosed(10, 15) : "+Arrays.toString(range10to15closed.toArray()));

输出。

1

2

range(10, 15) : [10, 11, 12, 13, 14]

rangeClosed(10, 15) : [10, 11, 12, 13, 14, 15]

5.IntStream min和max

IntStream有实用的方法来确定一系列数字或随机数字的最小值和最大值。

**使用min()**方法从int stream中检索最低值。

**使用max()**方法从int流中获取最高值。

1

2

System.out.println("range(10, 15) min value : "+IntStream.range(10, 15).min().getAsInt());

System.out.println("range(10, 15) max value : "+IntStream.range(10, 15).max().getAsInt());

输出。

1

2

range(10, 15) min value : 10

range(10, 15) max value : 14

6.IntStream查找值

在InstStream对象上使用**findFirst()findAny()**方法来获取第一个或任何一个值。

findFirst()与findAny()的深入比较

默认情况下,IntStream被创建为顺序流,除非对IntStream调用parallel()。

对于顺序流,findFirst()和findAny()方法返回相同的结果。然而,如果流是并行的,findAny()方法会给出一个随机值。

1

2

3

4

System.out.println("findFirst value : "+IntStream.iterate(10, i -> i + 2).limit(100).findFirst().getAsInt());

System.out.println("findAny value : "+IntStream.iterate(10, i -> i + 2).limit(100).findAny().getAsInt());

System.out.println("parallel findAny value : "+IntStream.iterate(10, i -> i + 2).limit(100).parallel().findAny().getAsInt());

输出。

1

2

3

findFirst value : 10

findAny value : 10

parallel findAny value : 160

7.IntStream map() 或 flatMap()

我们可以使用**map()方法将IntStream转换为新的形式,但flatMap()**方法将IntStream平铺为基元。

**map()和flatMap()**的使用与IntStream的使用没有太大的区别。

01

02

03

04

05

06

07

08

09

10

11

12

IntStream mapInput = IntStream.iterate(10, i -> i + 1).limit(10);

System.out.println("map input stream : "+Arrays.toString(mapInput.toArray()));

IntStream mapOutput = mapInput.map( i -> i * 2);

System.out.println("map Output stream : "+Arrays.toString(mapOutput.toArray()));

IntStream input1 = IntStream.iterate(10, i -> i + 1).limit(10);

System.out.println("flat map : "+Arrays.toString(input1.flatMap( i -> IntStream.of(i)).toArray()));

输出。

1

2

3

map input stream : [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

map Output stream : [20, 22, 24, 26, 28, 30, 32, 34, 36, 38]

flat map : [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

8.IntStream filter

使用filter()方法,根据给定的IntPredicate条件过滤整数值。

应用**filter()方法后,接下来你可以调用forEach()**或collect()方法将其转换为List或Set。

01

02

03

04

05

06

07

08

09

10

11

IntStream stream = IntStream.range(100, 200);

System.out.println("numbers divisible by 5 and 7 are : ");

stream.filter(i -> (i % 5 == 0 && i % 7 == 0)).forEach(System.out::println);

IntStream stream2 = IntStream.range(100, 200);

List<Integer> primes = stream2.filter(IntStreamOf::checkPrime).boxed().collect(Collectors.toList());

System.out.println("Prime numbers (100, 200) are "+primes);

输出。

1

2

3

4

5

numbers divisible by 5 and 7 are :

105

140

175

Prime numbers (100, 200) are [101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199]

9.IntStream distinct()

使用**distinct()**方法从IntStream中删除重复的值。

1

Arrays.toString(IntStream.of(1, 2, 3, 1, 2, 3).distinct().toArray());

输出。

10.IntStream到数组和列表或集合

**使用toArray()**方法将IntStream的输出收集到数组中。

**使用collect()**方法将IntStream的输出收集到List或Set中。

为了从Int Stream中删除重复的数据,你可以将结果收集到Set中,而不是使用distinct()方法。但建议使用distinct()方法。

1

2

3

4

5

6

7

8

9

int[] intArray = IntStream.of(1, 2, 3, 1, 2, 3).toArray();

System.out.println("int array : "+Arrays.toString(intArray));

List<Integer> list = IntStream.of(1, 2, 3, 1, 2, 3).boxed().collect(Collectors.toList());

System.out.println("IntStream to List : "+list);

Set<Integer> set = IntStream.of(1, 2, 3, 1, 2, 3).boxed().collect(Collectors.toSet());

System.out.println("IntStream to Set : "+set);

11.总结

在这篇文章中,我们已经看到了IntStream的所有有用的方法和有用的例子

GitHub

IntStream API