Stream数据类型
1、mapToInt、mapToLong、mapToDouble
可以将包装类拆箱成基本数据类型,节约内存空间
范例:求和
方式一:reduce实现
//方式一:reduce实现
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10,6,5,4,3,2,1);
list.stream().reduce(Integer::sum).ifPresent(System.out::println);
方式二:mapToInt
//方式二:mapToInt
list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10,6,5,4,3,2,1);
IntStream mapToInt = list.stream().mapToInt(i -> i.intValue());
int sum = mapToInt.sum();
System.out.println(sum);
方式三:mapToInt后用reduce实现
//方式三:mapToInt后用reduce实现
list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10,6,5,4,3,2,1);
IntStream intStream = list.stream().mapToInt(i -> i.intValue());
int reduce = list.stream().mapToInt(i -> i.intValue()).reduce(0, (i, j) -> i + j);
System.out.println(reduce);
区别:直接使用reduce实现,使用的是包装类Integer,用mapToInt则可以转成int计算,占用内存更小。
2、mapToObj
可以将数据直接转成对象,代码量少很多。
范例:
需求:1--100,中满足勾股定律的数字 3\4\5 9,并返回成一个数组。
1、原始分步骤写法:
int a = 9;
//创建1-100的数字
IntStream rangeClosed = IntStream.rangeClosed(1, 100);
//找到满足勾股定律的数字
Stream<Integer> boxed = rangeClosed.filter(i -> Math.sqrt(a * a + i * i) % 1 == 0).boxed();
//将数字转变成int数组返回
Stream<int[]> stream = boxed.map(b -> new int[]{a, b, (int) Math.sqrt(a * a + b * b)});
//输出数组数据
stream.forEach(array->System.out.println("a="+array[0]+",b="+array[1]+",c="+array[2]));
2、原始写法,代码简化后
int a = 9;
IntStream.rangeClosed(1, 100)
.filter(i->Math.sqrt(a*a + i*i)%1==0)
.boxed()
.map(b->new int[]{a,b,(int)Math.sqrt(a*a+b*b)})
.forEach(array->System.out.println("a="+array[0]+",b="+array[1]+",c="+array[2]));
3、mapToObj实现
int a = 9;
IntStream.rangeClosed(1, 100)
.filter(i->Math.sqrt(a*a + i*i)%1==0)
.mapToObj(b->new int[]{a,b,(int)Math.sqrt(a*a+b*b)})
.forEach(array->System.out.println("a="+array[0]+",b="+array[1]+",c="+array[2]));
输出结果:
a=9,b=12,c=15
a=9,b=40,c=41
使用mapToObj,代码更简洁,直接将满足条件数据,转成一个数组对象。
评论 (0)