大家好,我是工藤学编程 🦉 | 大二在读 |
|---|---|
作业侠系列最新文章😉 | Java实现聊天程序 |
一起备战ccf-csp与蓝桥杯系列最新文章🐷 | 一起备战蓝桥杯与CCF-CSP之大模拟炉石传说 |
一起刷算法与数据结构🐷 | 正在准备中 |
本篇文章讲的是
Java高级级核心之玩转 JDK8 集合框架,包含Stram,collector实战,希望对大家有帮助,这些都是Java编程中的利器
Java新特性玩转JDK8之流Stream实战
Stream 中文称为 “流”,通过将集合转换为这么⼀种叫做 “流”的元素队列,通过声明性方式,能够对集合中的每个元素进行⼀系列并行或串行的流水线操作 元素是特定类型的对象,所以元素集合看作⼀种流, 流在管道中传输, 且可以在管道的节点上进行处理, 比如
排序,聚合,过滤等操作
数据元素便是原始集合,如List、Set、Map等生成流,可以是串行流stream() 或者并行流 parallelStream()中间操作,可以是 排序,聚合,过滤,转换等 终端操作,很多流操作本身就会返回⼀个流,所以多个操作可以直接连接起来,
最后统⼀进行收集
给大家先来给开胃菜,比如某博主(我不说是谁)很想涨粉,但是现在涨粉的名单上没有他,他改怎么办?口嗨!
void testStream() {
List<String> list = Arrays.asList("涨粉", "涨100粉", "涨1000粉", "涨10000粉", "涨100000粉");
List<String> resultList = list.stream().map(obj -> "工藤学编程想" + obj).collect(Collectors.toList());
System.out.println(resultList);
}执行结果:

是不是特别简单
jdk8里面的流stream里的map和filter函数的使用
map函数
将流中的每⼀个元素 T 映射为 R(类似类型转换)
上面的的例子就是,类似遍历集合,对集合的每个对象做处理
换个场景:转换对象,如javaweb开发中集合里面的DO对象转换为DTO对象
代码实操:
UserDO@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserDO {
private Integer id;
private String name;
private String pwd;
}UserDTO
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserDTO {
private Integer userId;
private String userName;
}操作代码:
public static void testDOToDTO(){
List<UserDO> list = Arrays.asList(new UserDO(1, "⼩东", "123"), new
UserDO(21, "jack", "rawer"),
new UserDO(155, "tom", "sadfsdfsdfsd"),
new UserDO(231, "marry", "234324"), new UserDO(100, "工藤学编程", "122223"));
List<UserDTO> userDTOList = list.stream().map(obj -> {
UserDTO userDTO = new UserDTO(obj.getId(), obj.getName());
return userDTO;
}).collect(Collectors.toList());
System.out.println(userDTOList);
}结果:

filter函数
用于通过设置的条件过滤出元素
需求:过滤出字符串中包含"工藤"的字符串
代码如下:public static void testFilter(){
List<String> list = Arrays.asList("工藤新一", "工藤学编程",
"工藤静香", "公摊", "公投", "工具人", "工具狗", "工具毛");
List<String> resultList = list.stream().filter(obj -> obj.contains("工藤")).collect(Collectors.toList());
System.out.println(resultList);
}结果如下:
还有我:
哈哈哈,不信?不信你看:

排序(默认升序):
根据长度排序:public static void testSortAndLimit(){
List<String> list = Arrays.asList("工藤新一", "工藤学编程",
"工藤静香", "公摊", "公投", "工具人", "工具狗", "工具毛");
List<String> resultList =
list.stream().sorted(Comparator.comparing(obj ->
obj.length())).collect(Collectors.toList());
System.out.println(resultList);
}结果:

此时一只大阪黑鸡告诉我,他想降序怎么搞,我直接告诉他 你这样操作就行了
List<String> list = Arrays.asList("工藤新一", "工藤学编程",
"工藤静香", "公摊", "公投", "工具人", "工具狗", "工具毛");
List<String> resultList =
list.stream().sorted(Comparator.comparing(obj ->
obj.length(),Comparator.reverseOrder())).collect(Collectors.toList()
);
System.out.println(resultList);
}
此时,大版黑鸡又说,工藤,我只想要前3个怎么办?
安排:
public static void testSortAndLimit(){
List<String> list = Arrays.asList("工藤新一", "工藤学编程",
"工藤静香", "公摊", "公投", "工具人", "工具狗", "工具毛");
List<String> resultList =
list.stream().sorted(Comparator.comparing(String::length).reversed()
).limit(3).collect(Collectors.toList());
System.out.println(resultList);
}
完事 之后,黑鸡对我说,不亏是关东第一名侦探

jdk8里面的收集器collector
代码:
public static void testJoin(){
List<String> list = Arrays.asList("工藤新一", "工藤学编程",
"工藤静香", "公摊", "公投", "工具人", "工具狗", "工具毛");
String resultList =
list.stream().collect(Collectors.joining());
System.out.println(resultList);
}默认直接拼接:

大阪黑鸡说像以加号连接他们,安排
public static void testJoin(){
List<String> list = Arrays.asList("工藤新一", "工藤学编程",
"工藤静香", "公摊", "公投", "工具人", "工具狗", "工具毛");
String resultList =
list.stream().collect(Collectors.joining("+"));
System.out.println(resultList);
}
是不是有了这个方法特别方便!

实操代码,将含有工藤的分为一组
public static void testGroupBy(){
List<String> list = Arrays.asList("工藤新一", "工藤学编程",
"工藤静香", "公摊", "公投", "工具人", "工具狗", "工具毛");
Map<Boolean,List<String>>listMap = list.stream().collect(Collectors.groupingBy(obj->obj.contains("工藤")));
listMap.forEach((k,v)->{
System.out.println(k);
v.forEach((obj)->{
System.out.print(obj);
});
System.out.println();
}
);
}
好了,今天就到这里吧,希望大家给个三连哦!!!