Java基本类型流

时间:2020-01-09 10:35:15  来源:igfitidea点击:

Java Stream API是Java 8的重要补充之一,它提供了一种非常有效的方式来处理对象集合。由于Stream仅适用于对象引用,因此将其与原始类型一起使用不是很有效。当与Stream一起使用时,我们将需要使用包装器类来包装原始数据类型,即Stream <Integer>,Stream <Long>,Stream <Double>由于原始类型向相应对象的转换而使其效率低下。

幸运的是,Java Stream API为int,long和double的原始类型提供了Stream的原始专业化。 Java中可用的原始类型流是

  • IntStream –这是Stream的int原语专业化。
  • LongStream – Stream的长期原始专业化。
  • DoubleStream –这是Stream的双重原始专业化。

这就是主题Java原始类型流及其示例的全部内容。如果缺少某些内容,或者我们需要分享一些有关此主题的信息,请发表评论。

用Java创建原始流

为了创建原始流,所有三个类(IntStream,LongStream,DoubleStream)都提供empty()和of()方法。
Java Stream API的IntStream和LongStream类中还提供了range()方法。

empty()方法

empty()–此静态方法返回空的顺序原始流。

IntStream intStream = IntStream.empty();

要创建一个空的IntStream

LongStream longStream = LongStream.empty();

of()方法

要创建一个空的LongStream

  • 静态IntStream of(int t)–返回包含单个元素的顺序IntStream。

  • 静态IntStream of(int ... values)–返回其元素为指定值的顺序有序流。

有两个重载的of()方法,对于IntStream,这些of()方法定义为

LongStream和DoubleStream具有以long和double作为参数的of()方法的方式相同。

这是一个示例,其中返回DoubleStream中的max元素,并使用of()方法创建DoubleStream。

double max = DoubleStream.of(6.7, 8.9, 14.56, 22.34, 55).max().getAsDouble();
System.out.println("Max value- " + max);

输出:

Max value- 55.0

range()和rangeClosed()方法

对于IntStream和LongStream,也可以使用range()和rangeClosed()方法来创建流。

  • range(int startInclusive,int endExclusive)–以1的增量步从startInclusive(包括)到endExclusive(不包括)返回顺序的IntStream。

  • rangeClosed(int startInclusive,int endInclusive)–以1的增量步从startInclusive(包括)到endInclusive(包括)返回顺序的IntStream。

使用range()方法创建整数1-9的int流。

IntStream.range(1, 10).forEach(System.out::println);

输出:

1
2
3
4
5
6
7
8
9

使用rangeClosed()方法创建整数1-5的int流。

IntStream.rangeClosed(1, 5).forEach(System.out::println);

输出:

1
2
3
4
5

使用Arrays.stream()方法

通过将int数组,long数组或者double数组作为参数传递给Arrays.stream()方法,我们可以获得相应的原始类型流。此方法还有一个重载的变体,其中可以为数组索引指定范围。

  • stream(int [] array,int startInclusive,int endExclusive)在这里,startInclusive –要覆盖的第一个索引,inclusive endExclusive –在要覆盖的最后一个索引之后的索引

例如,从索引1-3的双精度数组中获取DoubleStream。

double[] dArray = new double[] {4, 5.6, 7.89, 0.34, 12};
Arrays.stream(dArray, 1, 4).forEach(System.out::println);

输出:

5.6
7.89
0.34

Java基本流中的操作

Java中为这些原始流提供了大多数常用的算术运算,如计数,平均值,总和,最大值,最小值。

1.使用DoubleStream获得双精度数组中所有元素的总和。

double[] dArray = new double[] {4, 5.6, 7.89, 0.34, 12};
double sum = Arrays.stream(dArray).sum();
System.out.println("Sum of array elements- " + sum);

输出:

Sum of array elements- 29.83

2.获取DoubleStream中的最大元素。

double max = DoubleStream.of(6.7, 8.9, 14.56, 22.34, 55).max().getAsDouble();
System.out.println("Max value- " + max);

输出:

Max value- 55.0

3.获取DoubleStream中的最大元素。

int min = IntStream.of(6, 8, 14, 22, 55).min().getAsInt();
System.out.println("Min value- " + min);

输出:

Min value- 6

4.获取IntStream中的平均值

double average = IntStream.of(6, 8, 14, 22, 55).average().getAsDouble();
System.out.println("average of values- " + average);

输出:

average of values- 21.0

将Stream转换为原始流

要将对象流转换为原始类型的流,Stream接口中有mapToInt,mapToLong和mapToDouble方法。

MapToInt方法示例

假设有一个Employee类,其中包含名称,部门,年龄字段。我们需要在员工列表中找出最大年龄。

public class Employee {
  private String name;
  private String dept;
  private int age;

  Employee(String name, String dept, int age){
    this.name = name;
    this.dept = dept;
    this.age = age;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public String getDept() {
    return dept;
  }
  public void setDept(String dept) {
    this.dept = dept;
  }
}

使用mapToInt方法,我们可以获取仅具有age字段的IntStream,然后获取最大年龄。

List<Employee> employeeList = new ArrayList<>();
employeeList.add(new Employee("Hyman", "Finance", 55));
employeeList.add(new Employee("Lisa", "Accounts", 34));
employeeList.add(new Employee("Nikita", "IT", 28));
employeeList.add(new Employee("Tony", "HR", 42));
int maxAge = employeeList.stream().mapToInt(e -> e.getAge()).max().getAsInt();
System.out.println("Max age- " + maxAge);

输出:

Max age- 55

将原始流转换为对象流

在某些情况下,我们希望将使用Java Stream API中的该盒装方法将原始类型的流转换为其等效的包装器流。

例如,如果要将IntStream收集到List,则需要将int值装箱到相应的Wrapper类,然后收集它。

List<Integer> intList = IntStream.of(6, 8, 14, 22, 55).boxed().collect(Collectors.toList());
System.out.println("List- " + intList);

输出:

List- [6, 8, 14, 22, 55]