`

JDK8流和lambda应用

 
阅读更多

1. String类型List集合排序

List<String> stringList = Arrays.asList("java", "python", "golang", "C#", "Julia", "shell");
List<String> collect = stringList.stream().sorted().collect(Collectors.toList());
collect.forEach(System.out::println);

2. 字符串数组拼接

List<String> stringList = Arrays.asList("abc", "spring", "java", "python");
// 单纯拼接
String result = stringList.stream().collect(Collectors.joining(""));
System.out.println(result); // 输出 abcspringjavapython
// 拼接间加入分隔符
String result1 = stringList.stream().collect(Collectors.joining("--"));
System.out.println(result1); // 输出 abc--spring--java--python
// 加大括号
String result2 = stringList.stream().collect(Collectors.joining("--", "{", "}"));
System.out.println(result2); // 输出 {abc--spring--java--python}

3. List<Map<String, String>> 数据去重

List<Map<String, String>> list = new ArrayList<>(16) ;
Map<String,String> map1 = new HashMap<>(16);
map1.put("key1", "val1");
Map<String,String> map2 = new HashMap<>(16);
map2.put("key1", "val1");
list.add(map1);
list.add(map2);

ArrayList<Map<String, String>> data = list.stream().collect(
	Collectors.collectingAndThen(Collectors.toCollection(
		() -> new TreeSet<>(Comparator.comparing(m -> m.get("key1")))), ArrayList::new));

4. List对象去重后进行排序操作

BookBo bookBo1 = new BookBo("1", "语文");
BookBo bookBo2 = new BookBo("2", "数学");
BookBo bookBo3 = new BookBo("3", "英语");
BookBo bookBo4 = new BookBo("4", "地理");
BookBo bookBo5 = new BookBo("5", "生物");
BookBo bookBo6 = new BookBo("1", "语文");
List<BookBo> bookBoList = Arrays.asList(bookBo1, bookBo2, bookBo3, bookBo4, bookBo5, bookBo6);

List<BookBo> distinctList = bookBoList.stream().collect(
	Collectors.collectingAndThen(Collectors.toCollection(
		()->new TreeSet<>(Comparator.comparing(o-> o.getName()))), ArrayList::new))
			.stream().sorted(Comparator.comparing(BookBo::getName)).collect(Collectors.toList());

5. partitioningBy 函数 分组

// 将list中字符串长度大于4的为一组,其他为另一组
List<String> stringList = Arrays.asList("abc", "spring", "java", "python");
Map<Boolean, List<String>> result = stringList.stream().collect(Collectors.partitioningBy(obj -> obj.length() > 4));
System.out.println(result); // 输出 {false=[abc, java], true=[spring, python]}

// 根据学生所在的省份进行分组
List<Student> students = Arrays.asList(new Student("辽宁", 18), new Student("吉林", 19),
		new Student("辽宁", 23), new Student("吉林", 20),
		new Student("辽宁", 24), new Student("吉林", 23));
Map<String, List<Student>> result2 = students.stream().collect(Collectors.groupingBy(obj -> obj.getProvince()));

 6. 统计各省份人数

List<Student> students2 = Arrays.asList(new Student("辽宁", 18), new Student("吉林", 19),
		new Student("辽宁", 23), new Student("吉林", 20),
		new Student("黑龙江", 24), new Student("北京", 23));
Map<String, Long> result2 = students2.stream().collect(Collectors.groupingBy(Student::getProvince,Collectors.counting()));
System.out.println(JSONUtil.parseObj(result2)); // 输出 {"黑龙江":1,"吉林":2,"辽宁":2,"北京":1}

 7. 统计一些人的年龄信息,如平均年龄,人数,最小,最大

List<Student> students = Arrays.asList(new Student("辽宁", 18), new Student("吉林", 19),
		new Student("辽宁", 23), new Student("吉林", 20),
		new Student("辽宁", 24), new Student("吉林", 23));
IntSummaryStatistics result = students.stream().collect(Collectors.summarizingInt(Student::getAge));
System.out.println("人数:"+result.getCount());
System.out.println("年龄总和:"+result.getSum());
System.out.println("最小年龄:"+result.getMin());
System.out.println("最大年龄:"+result.getMax());
System.out.println("平均年龄:"+result.getAverage());

 8. Stream实现递归查询树形结构

// 构造父级节点
List<User> listUser = list.stream().filter(user -> user.getLevelId().equals("0"))
	.peek(user -> user.setChildList(getChildrens(user,list))).collect(Collectors.toList());

// 构造子级节点
public List<User> getChildrens(User user,List<User> userList){
	List<User> childrens = userList.stream().filter(u -> Objects.equals(u.getLevelId(),user.getId())).map(
			u -> {
			   u.setChildList(getChildrens(u,userList));
			   return u;
			}
	).collect(Collectors.toList());
	return childrens;
}

 9. Stream实现根据age进行排序

List<Map<String, Object>> homePageViewList = CollUtil.newArrayList();

Map<String, Object> paramMap = new HashMap();
paramMap.put("name", "张三");
paramMap.put("age", "2");
homePageViewList.add(paramMap);

Map<String, Object> paramMap1 = new HashMap();
paramMap1.put("name", "李四");
paramMap1.put("age", "1");
homePageViewList.add(paramMap1);

homePageViewList = homePageViewList.stream().sorted((o1, o2) ->{
	Integer v1 = Integer.parseInt(o1.get("orderby").toString());
	Integer v2 = Integer.parseInt(o2.get("orderby").toString());
	return Integer.compare(v1, v2);
}).collect(Collectors.toList());

 

 10. Stream实现根据ID,将相同的数据进行合并

List<Map<String,Object>> newList = new ArrayList<Map<String,Object>>();
Map<String,Object> map3 = new HashMap<String,Object>();
map3.put("name","張三");
map3.put("id","1");
newList.add(map3);

Map<String,Object> map4 = new HashMap<String,Object>();
map4.put("name","李四");
map4.put("id","1");
newList.add(map4);

Map<String,Object> map1 = new HashMap<String,Object>();
map1.put("name","王三");
map1.put("id","2");
newList.add(map1);

Map<Object, List<Map<String, Object>>> result = newList.stream().collect(Collectors.groupingBy(m -> m.get("id")));

 10.Stream实现根据分组,去重,求count

List<Map<String, Object>> resultList = nativeQueryUpdate.getDataResultNativeQuery(SQL).getResultList();
Map<Object, Map<Object, Long>> resultDataMap = resultList.stream().distinct().collect(Collectors.groupingBy(m -> m.get("tar_ip")
       , Collectors.groupingBy(m -> m.get("tar_domain"), Collectors.counting())));

 11.Stream实现根据下标实现偶数和奇数进行归类

List list = Arrays.asList(1, 3, 5, 7, 9);
Map<Boolean, List<Object>> collect = IntStream.rangeClosed(1, list.size())
   .boxed()
   .map(i -> new AbstractMap.SimpleEntry<>(i, list.get(i - 1))) // 把数字和下标绑定起来
   .collect(Collectors.partitioningBy(simpleEntry -> Integer.parseInt(simpleEntry.getKey().toString()) % 2 == 0
       , Collectors.mapping(Map.Entry::getValue, Collectors.toList()))); // 按照下标是否能被2整除进行分组

 12.Stream实现List字符串数据转成Map

List<String> list = new ArrayList<>();
list.add("Mohan");
list.add("Sohan");
list.add("Mahesh");
Map<String, Object> map = list.stream().collect(Collectors.toMap(Function.identity(),s->0));

 13.Stream实现List对象数据转成Map

/**
 * List -> Map
 * 需要注意的是:
 * toMap 如果集合对象有重复的key,会报错Duplicate key ....
 *  apple1,apple12的id都为1。
 *  可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2
 */
List<User> users
Map<String, User> maps = users.stream().collect(Collectors.toMap(User::getName, a -> a,(k1,k2)->k1));

 14.Stream实现Map转List,接上

Map<Long, User> maps = users.stream().collect(Collectors.toMap(User::getId, Function.identity()));
List<User> userList = maps.entrySet().stream().map(Map.Entry::getValue).collect(Collectors.toList());

 15.根据名称获取产品

Map<String, Integer> resultMap3 = list.stream()
    .collect(Collectors.toMap(Product::getName, x -> x.getId()));        
System.out.println(resultMap3);

 16.List和数组互转

//List转数组
String[] arrays = list.toArray(new String[0]);
//或
String[] arrays = list.stream().toArray(String[]::new);
//数组转List
List<String> stringList = Arrays.asList(array);
//或者
List<String> list = Stream.of(arrays).collect(Collectors.toList());
 17.Set和数组互转
//Set转数组
String[] array=set.toArray(new String[0]);
//或
String[] array= set.stream().toArray(String[]::new);
//数组转Set
Set<String> set = new HashSet<>(Arrays.asList(array));
//或
Set<String> set = Stream.of(array).collect(Collectors.toSet());
 18.Set和List互转
//Set转List
List<String> list=new ArrayList<>(set);
或
List list=Stream.of(set.toArray(new String[0])).collect(Collectors.toList());
//List转Set
Set<String> set=new HashSet<>(list);
//或
Set<String> set = list.stream().collect(Collectors.toSet());
19.List转Map
Map<Long, 对象> sheetBoMap = sheetBoList.stream().collect(Collectors.toMap(对象::getId, Function.identity(), (k1, k2)->k2)));
//(k1, k2)->k2) 若出现Id重复的,则替换为第2个对象;少了这一句也可以,但是会抛出异常
分享到:
评论

相关推荐

    JDK8 中文帮助文档(jdk api 1.8 google.CHM)

    Stream API是JDK8的一大亮点,它提供了用于操作集合的新方式,支持串行和并行流,可以进行高效的数据处理和聚合操作,如map、filter、reduce等。 **5. Date和Time API重构** JDK8对日期和时间API进行了重大改进,...

    Jdk 8 lambda 表达式使用示范

    Java 8 是一个重要的版本更新,它引入了许多新特性,其中最引人注目的就是Lambda表达式和Stream API。这两个特性极大地提升了Java处理集合数据的能力,使得代码更加简洁、高效。接下来,我们将深入探讨Lambda表达式...

    jdk8官方文档

    8. **Nashorn JavaScript引擎**:JDK 8包含了Nashorn JavaScript引擎,允许Java与JavaScript进行交互,实现脚本编程和嵌入式JS应用。 9. **接口私有方法和静态方法**:JDK 8接口中还可以声明私有方法和静态方法,...

    jdk-8u25、jdk-8u111、jdk-8u131、jdk-8u181、jdk-8u201

    Java Development Kit (JDK) 是Java编程语言的核心组件,它包含了一个Java运行环境(JRE)、编译器(javac)以及其他工具,如jar、javadoc等,用于开发和运行Java应用程序。标题和描述中提到的"jdk-8u25、jdk-8u111...

    jdk8各平台64位压缩包合集

    - **Lambda表达式**: JDK 8引入了Lambda表达式,使得函数式编程风格在Java中变得更为简洁和易读,特别是在处理集合时。 - **方法引用和构造器引用**: 这些新特性允许直接引用已有方法或构造器,简化了代码并提升了...

    jdk8、jkd8中文手册

    Java开发工具包(JDK)是Java编程语言的核心组件,用于构建和运行Java应用程序。JDK8是Oracle公司发布的Java开发工具的一个重要版本,引入了许多创新功能,对开发者的工作效率产生了显著提升。在这个压缩包中,包含...

    JDK8安装包.zip

    本文将详细介绍如何在Windows操作系统上安装JDK8,以及探讨其主要特性和应用。 **1. JDK8的下载与安装** 首先,你需要访问Oracle官方网站下载JDK8的安装包。在本例中,我们拥有名为"jdk-8u361-windows-x64.exe"的...

    jdk8免安装版

    Java Development Kit(JDK)是Oracle公司提供的用于开发和运行Java应用程序的软件工具包。JDK8是Java编程语言的一个重要版本,引入了许多新特性,优化了语法,并提升了性能。在这个“jdk8免安装版”中,我们拥有的...

    JDK8U202.zip

    Java Development Kit(JDK)是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具。JDK8U202是Oracle公司发布的一个重要更新版本,尤其值得注意的是,这是JDK 8的最后一个免费...

    jdk8压缩包.zip

    Java Development Kit(JDK)是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具。 JDK 8是Oracle公司发布的Java平台标准版(Java SE)的一个重要版本,它引入了许多新特性,...

    jdk8和jdk17安装套件

    这里我们关注的是两个版本:JDK 8和JDK 17。 JDK 8: JDK 8是Oracle公司于2014年3月发布的Java平台标准版(Java SE)的一个重要版本。这个版本引入了许多新的特性,包括: 1. **lambda表达式**:这是Java 8中最显著...

    JDK8文档 jdk-1.8.0_221 jdk-8u221 API文档

    JDK8的`java.time`包替换掉了原来的`java.util.Date`和`java.util.Calendar`,引入了更加直观和强大的日期时间处理类,如LocalDate、LocalTime、LocalDateTime和ZonedDateTime等。 6. **Optional类** Optional类...

    jdk8 api中文版

    Java JDK 8 是Java开发的重要工具包,它包含了运行和构建Java应用程序所需的库和开发工具。JDK 8是Oracle公司发布的一个里程碑版本,引入了许多创新特性,极大地提升了开发效率和代码质量。对于那些英语不太熟练的...

    jdk1.8 Lambda表达式

    Java 8 引入的 Lambda 表达式是 Java 编程语言的重大变革之一,它允许以更简洁的方式表示单方法接口的实现,极大地增强了 Java 语言的表达能力,尤其是结合了函数式接口、Stream API 和其他新特性后。接下来,我们将...

    jdk_8中文文档

    2. **方法引用和构造器引用**:除了lambda表达式,JDK 8还支持方法引用和构造器引用,可以直接引用已有方法或类的构造器,减少了代码量并提高了可读性。 3. **默认方法**:在接口中可以定义默认方法,允许接口扩展...

    jdk8安装包下载地址.zip

    4. 测试与调试:JDK8的JVM和JDK自带的工具,如JConsole、VisualVM等,对于测试和调试Java应用程序非常有用。 总之,JDK8是Java开发中的重要组成部分,其特性改进了开发者的体验,提高了代码质量和效率。正确安装并...

    jdk 8 免费下载 / jdk8.zip

    Java Development Kit(JDK)是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具。 JDK 8是Oracle公司发布的Java平台标准版的一个重要版本,首次发布于2014年3月。这个版本引入...

    jdk8安装包(含windows和linux版本).zip

    Java Development Kit(简称JDK)是Oracle公司发布的用于开发和运行Java应用程序的工具包,它包含了Java编译器、Java虚拟机(JVM)、Java类库以及开发者工具。本压缩包"jdk8安装包(含windows和linux版本).zip"提供...

    jdk8中文说明文档_CHM.zip jdk1.8文档 jdk1.8说明文档

    Java Development Kit ...中文说明文档详细解释了每个特性的用法、示例以及如何在实际项目中应用,是学习和掌握JDK 8的重要参考资料。通过阅读这份文档,开发者能够更好地利用JDK 8的新功能,提升代码质量和开发效率。

    jdk8的安装包(包含linux和windows)

    Java Development Kit (JDK) 是Java编程语言的核心组件,它提供了编译、调试和运行Java应用程序所需的工具和库。在本资源中,我们有两个不同操作系统的JDK8安装包:一个是针对Windows系统的“jdk-8u271-windows-x64....

Global site tag (gtag.js) - Google Analytics