java8 lambda常用整理(2)

list集合数据分组

使用Collectors.groupingBy()方法来实现List集合数据的分组。groupingBy()方法接受一个分类函数,该函数将根据指定的条件将元素分组。

1.1. 示例1

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;public class GroupingExample {public static void main(String[] args) {// 创建一个包含字符串的ListList<String> fruits = Arrays.asList("apple", "banana", "orange", "apple", "banana", "apple");// 使用groupingBy方法进行分组Map<String, Long> result = fruits.stream().collect(Collectors.groupingBy(s -> s, Collectors.counting()));// 打印分组结果result.forEach((key, value) -> System.out.println(key + " : " + value));}
}

输出结果:

orange : 1
banana : 2
apple : 3

在上面的示例中,我们创建了一个包含水果名称的List。然后,我们使用fruits.stream().collect(Collectors.groupingBy(s -> s, Collectors.counting()))对水果进行分组。groupingBy()方法的第一个参数是分类函数,这里我们使用了Lambda表达式s -> s,表示按照元素自身进行分组。第二个参数Collectors.counting()是一个收集器,用于计算每个分组中的元素个数。

最后,我们通过遍历分组结果的Map,打印每个分组的键和值。

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;public class GroupingExample {public static void main(String[] args) {// 创建一个包含字符串的ListList<String> fruits = Arrays.asList("apple", "banana", "orange", "apple", "banana", "apple");// 使用groupingBy方法进行分组Map<String, Long> result = fruits.stream().collect(Collectors.groupingBy(s -> s, Collectors.counting()));// 打印分组结果result.forEach((key, value) -> System.out.println(key + " : " + value));}
}

输出结果:

orange : 1
banana : 2
apple : 3

1.2. 示例2

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;public class GroupingExample {public static void main(String[] args) {// 创建一个包含字符串的ListList<String> fruits = Arrays.asList("apple", "banana", "orange", "apple", "banana", "apple");// 使用groupingBy方法进行分组并将元素存储为ListMap<String, List<String>> result = fruits.stream().collect(Collectors.groupingBy(s -> s, Collectors.toList()));// 打印分组结果result.forEach((key, value) -> System.out.println(key + " : " + value));}
}

输出结果:

orange : [orange]
banana : [banana, banana]
apple : [apple, apple, apple]

在上面的示例中,我们使用Collectors.groupingBy()方法,并将Collectors.toList()作为下游收集器。这样,分组的元素将被存储为List。最后,我们通过遍历分组结果的Map,打印每个分组的键和对应的元素列表。
如果你希望将分组的元素存储为Set,只需将Collectors.toList()替换为Collectors.toSet()即可。

两个list取补集

下面是一个示例代码:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class ArrayListComplement {public static void main(String[] args) {List<Integer> list1 = new ArrayList<>();list1.add(1);list1.add(2);list1.add(3);list1.add(4);list1.add(5);List<Integer> list2 = new ArrayList<>();list2.add(3);list2.add(4);list2.add(5);list2.add(6);list2.add(7);// 取补集操作List<Integer> complementList = list1.stream().filter(element -> !list2.contains(element)).collect(Collectors.toList());System.out.println(complementList); // Output: [1, 2]}
}

在上面的代码中,我们使用Stream API将list1转换为一个流,并使用filter方法过滤掉那些在list2中存在的元素,最后通过collect方法将结果转换回一个新的ArrayList,得到了补集complementList

两个不同的map合并成一个其它类型的map

在 Java 8 中,要将两个不同类型的 Map 合并成一个其他类型的 Map,您可以使用流(Stream)和Lambda 表达式来进行操作。以下是一个示例代码,演示了如何执行这个操作。

假设我们有两个不同类型的 Map,一个包含整数作为键和字符串作为值,另一个包含字符串作为键和整数作为值。我们希望将它们合并成一个包含自定义对象作为值的 Map

首先,我们定义一个自定义的对象类型来保存整数和字符串:

public class CustomObject {private int intValue;private String stringValue;public CustomObject(int intValue, String stringValue) {this.intValue = intValue;this.stringValue = stringValue;}// Getters and setters (if needed)@Overridepublic String toString() {return "CustomObject{" +"intValue=" + intValue +", stringValue='" + stringValue + '\'' +'}';}
}

然后,我们可以编写代码来合并两个不同类型的 Map 并创建包含自定义对象的 Map

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;public class MapMergeExample {public static void main(String[] args) {Map<Integer, String> intToStringMap = new HashMap<>();intToStringMap.put(1, "One");intToStringMap.put(2, "Two");intToStringMap.put(3, "Three");Map<String, Integer> stringToIntMap = new HashMap<>();stringToIntMap.put("A", 10);stringToIntMap.put("B", 20);stringToIntMap.put("C", 30);Map<String, CustomObject> mergedMap = mergeMaps(intToStringMap, stringToIntMap);mergedMap.forEach((key, value) -> System.out.println(key + ": " + value));}public static Map<String, CustomObject> mergeMaps(Map<Integer, String> intToStringMap,Map<String, Integer> stringToIntMap) {return intToStringMap.entrySet().stream().filter(entry -> stringToIntMap.containsKey(entry.getValue())).collect(Collectors.toMap(entry -> entry.getKey() + "-" + entry.getValue(),entry -> new CustomObject(stringToIntMap.get(entry.getValue()), entry.getValue())));}
}

在这个示例中,我们首先定义了一个 CustomObject 类,包含整数和字符串属性。然后在 MapMergeExample 类中,我们创建了两个不同类型的 Map,一个包含整数到字符串的映射,另一个包含字符串到整数的映射。我们使用 mergeMaps 方法来合并这两个 Map,根据条件创建了一个包含 CustomObject 对象的新 Map

请注意,这个示例假设了一些条件,例如 intToStringMap 的值在 stringToIntMap 中有对应项。您可能需要根据实际情况对合并逻辑进行调整。

list转map value是自己

如果您想将一个列表(List)转换为一个映射(Map),并且映射的值应该是列表中的元素本身,您可以使用流(Stream)和Lambda 表达式来实现。在这种情况下,列表中的每个元素将成为映射的键和值。以下是示例代码,演示了如何执行这个操作:

import java.util.*;
import java.util.stream.Collectors;public class ListToMapValueIsSelf {public static void main(String[] args) {List<String> stringList = Arrays.asList("apple", "banana", "cherry");Map<String, String> selfValueMap = stringList.stream().collect(Collectors.toMap(item -> item, item -> item));selfValueMap.forEach((key, value) -> System.out.println(key + ": " + value));}
}

在这个示例中,我们创建了一个字符串列表 stringList,然后使用流操作的 collect 方法以及 Collectors.toMap 来将列表转换为映射。在 toMap 方法中,我们为键和值都提供了相同的提取函数,即使用元素本身作为键和值。这将创建一个映射,其中键和值都是列表中的元素。

最终,我们使用 forEach 方法来遍历映射并打印出键和值。

需要注意的是,如果列表中的元素存在重复值,将会抛出 IllegalStateException。在这种情况下,您可以提供一个合适的合并函数来处理重复键的情况,例如:

Map<String, String> selfValueMap = stringList.stream().collect(Collectors.toMap(item -> item, item -> item, (existing, replacement) -> existing));

这将保留先遇到的元素作为映射的值。

两个不同类型的map 合成一个list

Map 合成一个列表(List)。具体来说,您可以将两个 Map 的键值对合并为自定义对象,并将这些对象收集到一个列表中。以下是一个示例代码,演示了如何执行这个操作。

假设我们有两个不同类型的 Map,一个包含整数作为键和字符串作为值,另一个包含字符串作为键和整数作为值。我们希望将这两个 Map 的键值对合并成一个包含自定义对象的列表。

首先,我们定义一个自定义的对象类型来保存键和值:

public class CustomObject {private Object key;private Object value;public CustomObject(Object key, Object value) {this.key = key;this.value = value;}public Object getKey() {return key;}public Object getValue() {return value;}@Overridepublic String toString() {return "CustomObject{" +"key=" + key +", value=" + value +'}';}
}

然后,我们可以编写代码来合并两个不同类型的 Map 并创建包含自定义对象的列表:

import java.util.*;
import java.util.stream.Collectors;public class MapToListExample {public static void main(String[] args) {Map<Integer, String> intToStringMap = new HashMap<>();intToStringMap.put(1, "One");intToStringMap.put(2, "Two");intToStringMap.put(3, "Three");Map<String, Integer> stringToIntMap = new HashMap<>();stringToIntMap.put("A", 10);stringToIntMap.put("B", 20);stringToIntMap.put("C", 30);List<CustomObject> mergedList = mergeMapsToList(intToStringMap, stringToIntMap);mergedList.forEach(System.out::println);}public static List<CustomObject> mergeMapsToList(Map<Integer, String> intToStringMap,Map<String, Integer> stringToIntMap) {List<CustomObject> mergedList = new ArrayList<>();intToStringMap.forEach((key, value) -> mergedList.add(new CustomObject(key, value)));stringToIntMap.forEach((key, value) -> mergedList.add(new CustomObject(key, value)));return mergedList;}
}

在这个示例中,我们首先定义了一个 CustomObject 类,包含键和值属性。然后在 MapToListExample 类中,我们创建了两个不同类型的 Map,一个包含整数到字符串的映射,另一个包含字符串到整数的映射。我们使用 mergeMapsToList 方法来合并这两个 Map 并将键值对转换为自定义对象,然后将这些对象添加到列表中。
请注意,这个示例假设所有的键和值都是不同的。如果实际应用中有重复的键,您可能需要根据您的需求调整合并逻辑。

两个不同类型的list合并成一个其他类型的list

以下是一个示例代码,展示了如何执行此操作:

假设我们有两个不同类型的列表:一个包含整数,另一个包含字符串,我们希望将它们根据某个条件合并成一个包含自定义对象的列表。

首先,让我们定义一个自定义的对象类型来保存整数和字符串:

public class CustomObject {private int intValue;private String stringValue;public CustomObject(int intValue, String stringValue) {this.intValue = intValue;this.stringValue = stringValue;}// Getters and setters (if needed)@Overridepublic String toString() {return "CustomObject{" +"intValue=" + intValue +", stringValue='" + stringValue + '\'' +'}';}
}

然后,我们可以编写代码来合并两个列表,并根据条件创建自定义对象:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class ListMergeExample {public static void main(String[] args) {List<Integer> intList = new ArrayList<>();intList.add(1);intList.add(2);intList.add(3);List<String> stringList = new ArrayList<>();stringList.add("A");stringList.add("B");stringList.add("C");List<CustomObject> mergedList = mergeLists(intList, stringList);mergedList.forEach(System.out::println);}public static List<CustomObject> mergeLists(List<Integer> intList, List<String> stringList) {if (intList.size() != stringList.size()) {throw new IllegalArgumentException("Lists must have the same size");}return IntStream.range(0, intList.size()).mapToObj(i -> new CustomObject(intList.get(i), stringList.get(i))).collect(Collectors.toList());}
}

在这个示例中,我们定义了一个 CustomObject 类,包含整数和字符串属性。然后,在 ListMergeExample 类中,我们创建了两个不同类型的列表,一个包含整数,一个包含字符串。我们使用 mergeLists 方法来合并这两个列表,根据条件创建了一个包含 CustomObject 对象的列表,并通过流操作收集结果。

请注意,为了演示简单,我们假设两个列表的大小相同。如果实际应用中大小不同,您可能需要根据您的需求调整合并逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/181828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年国内主流的低代码平台

低代码开发平台&#xff08;Low-Code Development Platform, LCDS&#xff09;为企业和开发者提供了高效的应用开发方式。这些平台使得开发者可以通过简化的设计界面快速创建和部署应用&#xff0c;大大提高了开发效率并降低了开发成本。 伴随数字化转型推进&#xff0c;选购低…

C++中用于动态内存的new和delete操作符

文章目录 1、动态分配内存的应用2、动态分配内存与分配给普通变量的内存有什么不同?3、C 中如何分配/释放内存4、new 操作符4.1 使用new的语法4.2 初始化内存4.3 分配内存块4.4 普通数组声明 Vs 使用new4.5 如果运行时没有足够内存可用怎么办&#xff1f; 5、delete 操作符 C/…

使用Perplexity AI免费白嫖GPT4的使用次数((智能搜索工具)

一、Perplexity AI是什么 Perplexity AI是一款高质量的智能搜索工具&#xff0c;它可以为用户提供简洁清晰的搜索体验。Perplexity AI内置了基于GPT-4的Copilot搜索功能&#xff0c;用户可以在每四个小时使用五次(白嫖GPT-4)。此外&#xff0c;Perplexity AI有免费和付费&#…

C++——取地址和自增运算

今天做了道题一下给我整蒙了&#xff0c;把实验探索发篇文章&#xff0c;题目如下&#xff1a; int a[]{10,11,12},*p&a[0];执行完*p;*p1;后a[0],a[1],a[2]的值各为多少 答案是 10, 12, 12怎么理解*p,*p1呢&#xff0c;我觉得可以用汉语把代码读一下&#xff0c;p&#xf…

【寒武纪(6)】MLU推理加速引擎MagicMind,最佳实践(三)使用框架模型ONNX

支持情况 Pytorch 只支持 1.6.0 导出。 如何生成ONNX&#xff1f; 解析失败 包括&#xff1a;Parse 过程转换失败node index&#xff0c;不支持的模型输入tensor name&#xff0c;不支持的控制流子图输入tensor name。 提取支持的子图

sizeof与strlen有哪些区别

sizeof是操作符&#xff0c;strlen是函数。sizeof操作符的结果类型是size_t&#xff0c;它在头文件中typedef为unsignedint类型&#xff0c;该类型保证能容纳实现所建立的最大对象的字节大小。sizeof可以用类型做参数&#xff0c;strlen只能用char*做参数&#xff0c;且必须是以…

ArkTs变量类型、数据类型

可以参考官网学习路径学习HarmonyOS第一课|应用开发视频教程学习|HarmonyOS应用开发官网 一、变量 1、ArkTS语言 ArkTS是华为自研的开发语言。它在TypeScript&#xff08;简称TS&#xff09;的基础上&#xff0c;匹配ArkUI框架&#xff0c;扩展了声明式UI、状态管理等相应的…

acwing算法基础之动态规划--DP习题课1

目录 1 基础知识2 模板3 工程化 1 基础知识 暂无。。。 2 模板 暂无。。。 3 工程化 题目1&#xff1a;最长上升子序列&#xff0c;要求时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)。 解题思路&#xff1a;保存每个长度下的最小的结尾元素值&#xff0c;遍历数组元素…

hadoop源码解读

一、hadoop rpc总结 1、RPC指的是不同进程的方法调用&#xff0c;分为客户端和服务端&#xff0c;客户端调用服务端的方法&#xff0c;方法的执行在服务端。 2、如何实现Hadoop RPC的调用&#xff0c;必须要实现协议&#xff0c;这个协议其实就是一个接口&#xff0c;但是这个…

【Android Jetpack】Room数据库

文章目录 引入EntitiesPrimary Key主键索引和唯一性对象之间的关系外键获取关联的Entity对象嵌套对象Data Access Objects&#xff08;DAOs&#xff09;使用Query注解的方法简单的查询带参数查询返回列的子集可被观察的查询 数据库迁移用法 引入 原始的SQLite有以下两个缺点: …

LCD屏接口与模式详解:干货超多

前言 随着时代的发展&#xff0c;现如今我们生活上已经随处可见的各种电子产品了&#xff0c;诸如手机、平板、电脑、一些其它智能单品上都有用到显示屏&#xff0c;它作为人机交互的重要桥梁之一&#xff0c;我认为它是生活中必不可少的存在&#xff0c;如果少了它&#xff0c…

【Electron】上下键切换消息

需求&#xff1a; 如图&#xff0c;需要监听上下键切换消息 Electron 注册 全局快捷键【globalShortcut】监听 在focus注册 在blur 注销 如苹果系统在使用某个软件(focus)时 右上角会有应用标题 Electron 代码&#xff1a; win.on(focus, ()>{globalShortcut.register(U…

物联网边缘计算是什么?如何实现物联网边缘计算?

物联网边缘计算是一种在物联网设备和网络中实施计算和数据处理的技术。它允许在物联网设备或网络边缘进行数据分析和处理&#xff0c;而不需要将所有数据传输到远程数据中心或云端进行处理。物联网边缘计算将计算和数据处理的能力迁移到物联网设备的边缘&#xff0c;使得设备能…

如何群发发票邮件内容

群发发票邮件内容需要仔细考虑邮件的主题、正文和附件内容&#xff0c;以确保邮件的准确性和完整性。以 一、明确邮件目的 在群发发票邮件时&#xff0c;首先需要明确邮件的目的。一般来说&#xff0c;发票邮件的目的是向客户或供应商提供交易的详细记录和证明。因此&#xf…

啊哒-MISC-bugku-解题步骤

——CTF解题专栏—— 题目信息&#xff1a; 题目&#xff1a;啊哒 作者&#xff1a;第七届山东省大学生网络安全技能大赛 提示&#xff1a;无 解题附件&#xff1a; 解题思路&#xff1a; 图片的话还是老三样斧winwalk、010Editor、Stegsolve。ok直接开搞&#xff01; 解题…

基于UDP的TFTP文件传输

代码&#xff1a; #include <myhead.h>//实现下载功能 int download(int cfd,struct sockaddr_in sin) {char buf[516] ""; //定义资源包char fileName[128] ""; //定义文件名printf("请输入文件名:");scanf("%s",fileName…

Re0: 从零实现一个置顶任意窗口的小工具

前言 话不多说&#xff0c;先上效果&#xff1a; 这里展示的是通过下拉框选择窗口&#xff0c;让窗口显示并置顶&#xff0c;其实还可以直接通过快捷键&#xff08;先鼠标点击要置顶的窗口&#xff0c;再使用CTRLSHIFTT&#xff09;&#xff0c;本文涉及到的完整代码已上传到G…

【JavaEE初阶】 HTTP 请求 (Request)详解

文章目录 &#x1f340;序言&#x1f384;认识URL&#x1f6a9;URL 基本格式&#x1f6a9;query string&#x1f6a9;关于 URL encode &#x1f334;认识 "方法" (method)&#x1f6a9;GET方法&#x1f6a9;POST 方法&#x1f6a9; GET 和 POST 的区别 &#x1f38b;…

Java后端开发——JDBC(万字详解)

Java后端开发——JDBC&#xff08;万字详解&#xff09; 今日目标 掌握JDBC的的CRUD理解JDBC中各个对象的作用掌握Druid的使用 1&#xff0c;JDBC概述 在开发中我们使用的是java语言&#xff0c;那么势必要通过java语言操作数据库中的数据。这就是接下来要学习的JDBC。 1.1 …

【Axure高保真原型】区间评分条

今天和大家分享区间评分条的原型模板&#xff0c;我们可以左右拖动移动滑块到指定位置&#xff0c;评分条上方会根据两个滑块所在的位置&#xff0c;自动计算出对应的区间范围&#xff1b;这个原型模板使用也很简单&#xff0c;只需要在里面填写区间的最大值&#xff0c;即可自…