写点什么

【Java8 新特性 5】Java8 stream 的详细用法,java 开发面试视频

用户头像
极客good
关注
发布于: 刚刚

Optional<Integer> max = list.stream().max(Integer::compareTo);


// 自定义排序


Optional<Integer> max2 = list.stream().max(new Comparator<Integer>() {


@Override


public int compare(Integer o1, Integer o2) {


return o1.compareTo(o2);


}


});


System.out.println(max2);


}



//获取员工中年龄最大的人


private static void test06() {


initPerson();


Comparator<? super Person> comparator = Comparator.comparingInt(Person::getAge);


Optional<Person> max = personList.stream().max(comparator);


System.out.println(max);


}


(3)获取员工中年龄最大的人?



(4)计算 integer 集合中大于 10 的元素的个数


4、map 与 flatMap

map:接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。


flatMap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。




(1)字符串大写



(2)整数数组每个元素+3?


/**


  • 整数数组每个元素+3

  • @思路

  • List<Integer> list = Arrays.asList(1, 17, 27, 7);


List<Integer> list2 = new ArrayList<Integer>();


for(Integer num : list) {


list2.add(num + 3);


}


@return [4, 20, 30, 10]


*/


private static void test09() {


List<Integer> list = Arrays.asList(1, 17, 27, 7);


List<Integer> collect = list.stream().map(x -> x + 3).collect(Collectors.toList());


System.out.println(collect);


}


(3)公司效益好,每人涨 2000?


/**


  • 公司效益好,每人涨 2000


*/


private static void test10() {


initPerson();


List<Person> collect = personList.stream().map(x -> {


x.setAge(x.getSalary()+2000);


return x;


}).collect(Collectors.toList());


System.out.println(collect);


}



(4)将两个字符数组合并成一个新的字符数组


/**


  • 将两个字符数组合并成一个新的字符数组


*/


private static void test11() {


String[] arr = {"z, h, a, n, g", "s, a, n"};


List<String> list = Arrays.asList(arr);


System.out.println(list);


List<String> collect = list.stream().flatMap(x -> {


String[] array = x.split(",");


Stream<String> stream = Arrays.stream(array);


return stream;


}).collect(Collectors.toList());


System.out.println(collect);


}


(5)将两个字符数组合并成一个新的字符数组


/**


  • 将两个字符数组合并成一个新的字符数组

  • @return [z, h, a, n, g, s, a, n]


*/


private static void test11() {


String[] arr = {"z, h, a, n, g", "s, a, n"};


List<String> list = Arrays.asList(arr);


List<String> collect = list.stream().flatMap(x -> {


String[] array = x.split(",");


Stream<String> stream = Arrays.stream(array);


return stream;


}).collect(Collectors.toList());


System.out.println(collect);


}

5、规约 reduce?

归约,也称缩减,顾名思义,是把一个流缩减成一个值,能实现对集合求和、求乘积和求最值操作。



(1)求 Integer 集合的元素之和、乘积和最大值


/**


  • 求 Integer 集合的元素之和、乘积和最大值


*/


private static void test13() {


List<Integer> list = Arrays.asList(1, 2, 3, 4);


//求和


Optional<Integer> reduce = list.stream().reduce((x,y) -> x+ y);


System.out.println("求和:"+reduce);


//求积


Optional<Integer> reduce2 = list.stream().reduce((x,y) -> x * y);


System.out.println("求积:"+reduce2);


//求最大值


Optional<Integer> reduce3 = list.stream().reduce((x,y) -> x>y?x:y);


System.out.println("求最大值:"+reduce3);


}



(2)求所有员工的工资之和和最高工资?


/*


  • 求所有员工的工资之和和最高工资


*/


private static void test14() {


initPerson();


Optional<Integer> reduce = personList.stream().map(Person :: getSalary).reduce(Integer::sum);


Optional<Integer> reduce2 = personList.stream().map(Person :: getSalary).reduce(Integer::max);


System.out.println("工资之和:"+reduce);


System.out.println("最高工资:"+reduce2);


}


6、收集(toList、toSet、toMap)

取出大于 18 岁的员工转为 map?


/**


  • 取出大于 18 岁的员工转为 map


*/


private static void test15() {


initPerson();


Map<String, Person> collect = personList.stream().filter(x -> x.getAge() > 18).collect(Collectors.toMap(Person::getName, y -> y));


System.out.println(collect);


}


7、collect

Collectors提供了一系列用于数据统计的静态方法:


  • 计数:count

  • 平均值:averagingIntaveragingLongaveragingDouble

  • 最值:maxByminBy

  • 求和:summingIntsummingLongsummingDouble

  • 统计以上所有:summarizingIntsummarizingLongsummarizingDouble


/**


  • 统计员工人数、平均工资、工资总额、最高工资


*/


private static void test01(){


//统计员工人数


Long count = personList.stream().collect(Collectors.counting());


//求平均工资


Double average = personList.stream().collect(Collectors.averagingDouble(Person::getSalary));


//求最高工资


Optional<Integer> max = personList.stream().map(Person::getSalary).collect(Collectors.maxBy(Integer::compare));


//求工资之和


Inte


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


ger sum = personList.stream().collect(Collectors.summingInt(Person::getSalary));


//一次性统计所有信息


DoubleSummaryStatistics collect = personList.stream().collect(Collectors.summarizingDouble(Person::getSalary));


System.out.println("统计员工人数:"+count);


System.out.println("求平均工资:"+average);


System.out.println("求最高工资:"+max);


System.out.println("求工资之和:"+sum);


System.out.println("一次性统计所有信息:"+collect);


}


8、分组(partitioningBy/groupingBy)

  • 分区:将 stream 按条件分为两个Map,比如员工按薪资是否高于 8000 分为两部分。

  • 分组:将集合分为多个 Map,比如员工按性别分组。有单级分组和多级分组。



将员工按薪资是否高于 8000 分为两部分;将员工按性别和地区分组


public class StreamTest {


public static void main(String[] args) {


personList.add(new Person("zhangsan",25, 3000, "male", "tieling"));


personList.add(new Person("lisi",27, 5000, "male", "tieling"));


personList.add(new Person("wangwu",29, 7000, "female", "tieling"));


personList.add(new Person("sunliu",26, 3000, "female", "dalian"));


personList.add(new Person("yinqi",27, 5000, "male", "dalian"));


personList.add(new Person("guba",21, 7000, "female", "dalian"));


// 将员工按薪资是否高于 8000 分组


Map<Boolean, List<Person>> part = personList.stream().collect(Collectors.partitioningBy(x -> x.getSalary() > 8000));


// 将员工按性别分组


Map<String, List<Person>> group = personList.stream().collect(Collectors.groupingBy(Person::getSex));


// 将员工先按性别分组,再按地区分组


Map<String, Map<String, List<Person>>> group2 = personList.stream().collect(Collectors.groupingBy(Person::getSex, Collectors.groupingBy(Person::getArea)));


System.out.println("员工按薪资是否大于 8000 分组情况:" + part);


System.out.println("员工按性别分组情况:" + group);


System.out.println("员工按性别、地区:" + group2);


}


}


9、接合 joining?

joining可以将 stream 中的元素用特定的连接符(没有的话,则直接连接)连接成一个字符串。


10、排序 sorted

将员工按工资由高到低(工资一样则按年龄由大到小)排序


private static void test04(){


// 按工资升序排序(自然排序)


List<String> newList = personList.stream().sorted(Comparator.comparing(Person::getSalary)).map(Person::getName)


.collect(Collectors.toList());


// 按工资倒序排序


List<String> newList2 = personList.stream().sorted(Comparator.comparing(Person::getSalary).reversed())


.map(Person::getName).collect(Collectors.toList());


// 先按工资再按年龄升序排序


List<String> newList3 = personList.stream()


.sorted(Comparator.comparing(Person::getSalary).thenComparing(Person::getAge)).map(Person::getName)


.collect(Collectors.toList());


// 先按工资再按年龄自定义排序(降序)


List<String> newList4 = personList.stream().sorted((p1, p2) -> {


if (p1.getSalary() == p2.getSalary()) {


return p2.getAge() - p1.getAge();


} else {


return p2.getSalary() - p1.getSalary();


}


}).map(Person::getName).collect(Collectors.toList());


System.out.println("按工资升序排序:" + newList);


System.out.println("按工资降序排序:" + newList2);


System.out.println("先按工资再按年龄升序排序:" + newList3);


System.out.println("先按工资再按年龄自定义降序排序:" + newList4);


}


11、提取/组合

流也可以进行合并、去重、限制、跳过等操作。


private static void test05(){


String[] arr1 = { "a", "b", "c", "d" };


String[] arr2 = { "d", "e", "f", "g" };


Stream<String> stream1 = Stream.of(arr1);


Stream<String> stream2 = Stream.of(arr2);


// concat:合并两个流 distinct:去重


List<String> newList = Stream.concat(stream1, stream2).distinct().collect(Collectors.toList());


// limit:限制从流中获得前 n 个数据


List<Integer> collect = Stream.iterate(1, x -> x + 2).limit(10).collect(Collectors.toList());


// skip:跳过前 n 个数据


List<Integer> collect2 = Stream.iterate(1, x -> x + 2).skip(1).limit(5).collect(Collectors.toList());


System.out.println("流合并:" + newList);


System.out.println("limit:" + collect);


System.out.println("skip:" + collect2);


}


12、读取文件的流操作


13、计算两个 list 中的差集


//计算两个 list 中的差集

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
【Java8 新特性 5】Java8 stream的详细用法,java开发面试视频