Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >4.1.java8新特性持续更新

4.1.java8新特性持续更新

原创
作者头像
itjim
修改于 2019-11-25 06:19:15
修改于 2019-11-25 06:19:15
40100
代码可运行
举报
文章被收录于专栏:springboot解析springboot解析
运行总次数:0
代码可运行

1.java8在Collection中新增加的方法removeIf

记得我在以前找工作的经历中,遇到过一个面试官问过我一个很基础的问题。问题是:有一个List中有10个元素,我现在想从中删除3个元素,请问怎么做?我当时也没想,就直接说,List的有自带的remove方法,可以直接使用,他说请详细的说明一下,我说写一个for循环,循环的次数是List的长度,然后在循环里面直接删除掉想要删除的元素就可以了。

当时还想,这么简单的问题也问,面试官说,你回去自己试试就知道了,你看按照你说的那样写会不会报错。然后我就懵了,虽然这是个简单的问题但是日常的编码中,我还真没有注意过这个小细节,然后面试结果可想而知了。

我回去以后自己真的试了一次还真的会报错,原来在遍历的过程中是不对List操作进行修改的,无论是删除和添加,因为如果在遍历中一直向集合中新增加元素,会造成死循环的,还有就是如果在遍历过程中删除元素,会造成数组下表越界等问题。一般的操作方式是通过addAll方法和removeAll方法来实现的功能的。

例如下面的这种

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
public void myTestLearnMore()
{
    List<String> testList = new ArrayList<>();
    testList.add("1杨");
    testList.add("1李");
    testList.add("1王");
    testList.add("1张");
    testList.add("2杨");
    testList.add("2孙");
    testList.add("2赵");
    List<String> temAddList = new ArrayList<>();
    for(String test : testList)
    {
        if(test.startsWith("1"))
        {
            temAddList.add(test);
        }
    }
    testList.removeAll(temAddList);
    System.out.println(JSON.toJSONString(testList));
}

打印结果是:[“2杨”,”2孙”,”2赵”]

这才是真正的操作方式。不过今天我要说的其实Java8的新增的集合方法,像上面先创建一个临时集合然后再通过遍历将需要移除的元放到临时集合中,最后再整体从原始集合中删除。这样要写五六行的代码,在java8中用一行代码就可以搞定了。就是下面这行代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
testList.removeIf(test->test.startsWith("1"));

这句代码的意思是移除符合removeIf参数格式的元素,所以在这行代码后面再打印testList,就不会打印出以1开头的元素了。

这些小细节其实都是在日常的编码过程中积累出来的,遇到的坑多了,以后再写的时候就会注意了,就像是java中在使用equals的时候,从来都是已知的常量放equals前面,防止出现空指针异常,在集合使用lambda表达式的时候,都要通过Objects.nonNull()先判断集合是不是null,在打印对象的时候不要直接调用对象的toString()方法,要将对象传递给Objects的toString方法,这样就算对象是个null也可以打印出来。Objects这个类是java7新增的工具类。

2.Java8 Stream经典示例

示例一:现在有一个List<User> 的集合,如何把这个list转换成Map<Integer, User> 其中,key是user id,value是User对象

class User {

private int id;

private String name;

public User(int id, String name) {

this.id = id;

this.name = name;

}

public int getId() {

return id;

}

public String toString() {

return "User [id=" + id + ", name=" + name + "]";

}

}

代码如下:

List<User> users = Arrays.asList(new User(1, "Tomcat"), new User(2, "Apache"), new User(3, "Nginx"));

Map<Integer, User> map = users.stream().collect(Collectors.toMap(obj -> obj.getId() , obj -> obj));

System.out.println(map);

或者使用方法的引用

Map<Integer, User> map = users.stream().collect(Collectors.toMap(User::getId , obj -> obj));

最后,输出结果

{1=User [id=1, name=Tomcat], 2=User [id=2, name=Apache], 3=User [id=3, name=Nginx]}

示例二:如何把list中的每个map中的id取出来,转换成list<String>

有如下List<Map<String, String>>

List<Map<String, String>> list = new ArrayList<>();

Map<String, String> map1 = new HashMap<>();

map1.put("id", "101");

map1.put("name", "Tomcat");

Map<String, String> map2 = new HashMap<>();

map2.put("id", "102");

map2.put("name", "Apache");

Map<String, String> map3 = new HashMap<>();

map3.put("id", "103");

map3.put("name", "Nginx");

list.add(map1);

list.add(map2);

list.add(map3);

参考代码如下:

List<String> ids = list.stream().map(entity -> entity.get("id")).collect(Collectors.toList());

System.out.println(ids);

或者

List<Object> ids = Arrays.asList(list.stream().map(entity -> entity.get("id")).toArray());

输出结果:

[101, 102, 103]

示例三:如何把url的请求参数(如:type=1&from=APP&source=homePage)转换成Map<String, String>

参考代码:

String queryString = "type=1&from=APP&source=homePage";

Map<String, String> map = Stream.of(queryString.split("&")).map(obj -> obj.split("=")).collect(Collectors.toMap(entry -> entry[0], entry -> entry[1]));

System.out.println(map);

输出结果:

{from=APP, source=homePage, type=1}

示例四:把List<String>转换成List<Integer>

List<String> strs = Arrays.asList("1","2","3");

List<Integer> ints = strs.stream().map(obj -> Integer.valueOf(obj)).collect(Collectors.toList());

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
4.2.Java8 Stream简单的应用
        元素序列:像集合一样,流也提供了一个接口,可以访问特定元素类型的一组有序值,因为集合是数据结构,所以他的主要目的是以特定的时间/空间复杂度存储和访问元素,但流的目的在于表达计算。集合讲的是数据,流讲的是计算。
itjim
2019/11/22
7950
4.2.Java8 Stream简单的应用
Java8新特性stream流
Java8新特性stream流 一、包装数据类型 @Test public void main22() { List<Integer> list = new ArrayList<Integer>(){{ add(7); add(5); add(1); add(2); add(8); add(4); add(3); add(6); add(3); add(6); add(3); add(6); }}; // 过滤 List<Int
半月无霜
2023/03/03
5000
JDK8新特性
文章目录 1. JDk8新特性 1.1. 函数式编程 1.1.1. 集合的foreach 1.1.2. lambda表达式轻松创建接口实例 1.1.3. 接口的默认方法和静态方法 1.1.4. Stream 1.1.4.1. filter 1.1.4.2. sorted 1.1.4.3. 查找和匹配 1.1.4.4. 归约 1.1.4.4.1. map 1.1.4.4.2. reduce 1.1.4.5. 分组 1.2. Optional 1.3. Collectors 1.3.1. toMap 1.3
爱撒谎的男孩
2019/12/31
8280
java8 Lambda Stream collect Collectors 常用实例
字典查询和数据转换 toMap时,如果value为null,会报空指针异常 解决办法一:
Erwin
2019/12/31
3.8K0
Java对象,Map,List,Set数组等相互转换大全(详细讲解,附代码,讲解案例)
本人记录,因为基础比较差整理出来方便自己学习; 同样也希望可以对大家有帮助,有可以优化的地方的意见和建议,欢迎提出,鄙人虚心接受,认真改正;
默 语
2024/11/20
4480
Java对象,Map,List,Set数组等相互转换大全(详细讲解,附代码,讲解案例)
java8 stream().map().collect()的Collectors.toList()、Collectors.toMap()、Collectors.groupingBy()的用法[通俗易
  现在需要将这些user的id提取出来。这个很简单,for循环嘛,谁不会啊(不会吧不会吧,不会有人还不会用for循环的吧)。
全栈程序员站长
2022/09/24
3.4K0
java8 stream().map().collect()的Collectors.toList()、Collectors.toMap()、Collectors.groupingBy()的用法[通俗易
JDK 11 及以上版本 Java 最新技术之集合框架实操应用解析
以下是基于Java最新技术(JDK 11+)的集合框架实操内容,结合了Java 8+的新特性(如Stream API、Lambda表达式)和并发编程的最佳实践。
啦啦啦191
2025/06/21
770
JDK 11 及以上版本 Java 最新技术之集合框架实操应用解析
JAVA8新特性之List的各种用法(最大、最小、平均值、分组、求和、遍历、过滤、排序)
构建一个User实体类供演示 public class Users { /** * ID */ private Long id; /** * 用户名 */ private String name; /** * 年龄 */ private int age; /** * 工号 */ private String jobNumber; /** * 性别
Kevin_Zhang
2021/06/29
3.9K0
JAVA合并两个具有相同key的map为list
JAVA合并两个具有相同key的map为list,不多说,直接上代码: public class MapUtil { public static void main(String[] args){ List<Map<String,String>> osvList = new ArrayList<>(); Map<String,String> map1 = new HashMap<>(); map1.put("osV","5.1");
一诺千金
2020/04/25
5.5K0
Stream & JDK8新特性
我们日常SQL使用的时候,都是Group By实现分组。Stream也有类似功能,比如一个集合有3个组的员工,我们想获取每个组的员工,就可以通过.collect(Collectors.groupingBy(Obj::getXXX));实现。返回的集合是Map集合!
收心
2022/11/11
2760
Stream & JDK8新特性
Java8合并两个Map中元素的正确姿势
英文原文地址:https://www.baeldung.com/java-merge-maps
明明如月学长
2021/08/27
7.7K0
Java1.8新特性 -- Srream流
元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。其形式好比下面的图:
Java深度编程
2020/06/10
1.1K0
Java 开发中Stream的toMap与Map 使用技巧
toMap () 的默认行为是,如果遇到重复的键,就直接抛出IllegalStateException。这就好比你在玩消消乐,好不容易凑齐三个相同的元素,结果游戏直接闪退了。这种设计在大多数情况下是合理的,因为 Map 的键必须唯一。但在实际开发中,数据重复的情况并不少见,比如从数据库查询数据时,可能会因为业务逻辑问题导致重复记录。
闻说社
2025/07/03
1320
Java 开发中Stream的toMap与Map 使用技巧
Java8 新特性
Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以取代大部分的匿名内部类,可以写出更简洁、更灵活的代码。尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。作为一种更紧凑的代码风格,使 Java 的语言表达能力得到提升。JDK 也提供了大量的内置函数式接口供我们使用,使得 Lambda 表达式的运用更加方便、高效。 【1】从匿名类到 Lambda 的转换:虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可以使用 Lambda 表达式来实现。Lambda 规定接口中只能有一个需要被实现的方法,不是规定接口中只能有一个方法。
Java架构师必看
2021/05/14
9830
Java8 新特性
自定义list To HashMap工具类
我们在使用JDK自带的Collectors.toMap时,可能会遇到如下问题(什么?你不知道toMap干嘛的?戳我了解):
阿超
2022/08/16
3300
Lambda表达式和函数式编程
迭代器内第一个参数为初始值,第二个参数为一个lambda表达式,因为这个循环是个死循环所以这边limit了前10个元素
后端码匠
2021/04/02
1.3K0
JDK8新特性详解Lambda&Stream
我们要使用lambda表达式,接口里面只能有一个方法,但是有可能其他人往这个接口里面写代码,所以我们在这个接口里面写一个注解@FunctionalInterface;这个接口就是一个标注注解,被这个注解修饰的接口,只能有一个抽象方法
一写代码就开心
2022/05/25
4000
JDK8新特性详解Lambda&Stream
Java新特性:Stream流式编程
Stream 流是 Java8 提供的新功能,是对集合对象功能的增强,能对集合对象进行各种非常便利、高效的聚合操作,或大批量数据操作。Stream 流以一种声明性方式处理数据集合,它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用fork/join并行方式来拆分任务和加速处理过程。
栗筝i
2023/10/16
1.3K0
Java新特性:Stream流式编程
Java线上惨痛踩坑记录,你也一定遇到过
如果调用上面的方法会发生什么?id是Integer类型,而方法的返回值int类型,会自动拆箱转换,由于id是null,转换成int类型的时候,就会报NullPointerException异常。
一灯架构
2022/09/15
6440
Java线上惨痛踩坑记录,你也一定遇到过
JAVA——JDK 8新特性学习与整理
在自己工作、开发、学习中,特别是在阅读别人的项目源码时,总是能看到使用Lambda表达式和Stream流的代码写法,这两个新特性是JDK 8主要的特性和自己的编程风格。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8,现如今已经JDK14都出来了,所以了解,阅读,和使用JDK 8新特性是非常有必要的,在面试的过程中也会经常被问到。
不愿意做鱼的小鲸鱼
2022/09/26
6080
JAVA——JDK 8新特性学习与整理
相关推荐
4.2.Java8 Stream简单的应用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验