Java基本类型流
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]