javaFunction函数,函数式接口,HashMap中的computeIfAbsent() 方法的使用

news2024/9/21 14:49:21

由于平时很少用到这种写法,导致每次看到有一脸懵逼,然后一段时间就要总结复习一次。。。。。。

如图所示

???这是什么牛马写法? Function<String, String> toUpperCase = str -> str.toUpperCase();

仔细分析一下,这因该要新建一个对象吧。那么不应该这么写么?

Function<String, String> objectObjectFunction = new Function<String,String>();

我试试,?idea怎么给爆红了??我看看,哦这是一个接口,不能直接new是吧。。。

好吧那我们写个实现类再来new这个对象??。。。好麻烦,还得新建一个类实现这个接口咋来创建对象么。。。

我记得之前学了匿名内部类来着,我试试。。

(147条消息) 什么是匿名内部类,如何使用匿名内部类_Weihaom_的博客-CSDN博客

看我new一个匿名内部类出来实现这个接口的方法

然后我重写一下这个方法。??怎么回事,他怎么这么短???我看看他怎么搞得

idea好像给了我一个提示,我试试,woc 牛哇牛哇这个lambda可真牛哇

觉得简单的选手可以去试试进阶

Java 8 Function 函数接口 | 未读代码 (wdbyte.com)
(147条消息) 匿名内部类,函数式接口_初见qwer的博客-CSDN博客
(147条消息) Java函数式编程(一)–Function的使用_java function函数的用法_boyn博言的博客-CSDN博客

可算明白了。。。好的,开始进入正题。map.computeIfAbsent的用法?

首先,我们看一个网上常见的例子

    public static void main(String[] args) {
        // 创建一个 HashMap
        HashMap<String, List<String>> map = new HashMap<>();
        // 往HashMap中添加映射项
        map.put("A", new ArrayList<>(Arrays.asList("a1", "a2")));
        System.out.println("HashMap: " + map);

        List<String> stringList = map.computeIfAbsent("A", key -> new ArrayList<>());
        System.out.println(stringList);

        map.computeIfAbsent("A", key -> new ArrayList<>()).add("a3");
        // 输出更新后的HashMap
        System.out.println("Updated HashMap: " + map);

    }

我们来看看这个方法这里显示该方法需要两个参数,第二个怎么有点眼熟??这不就是我们刚刚将的Function函数式接口作为参数么?对了,还要注意返回值是个value。

那好办了,我们来展开这个lambda吧,emmm传入一个值,返回280。so?就是判断如果shirt不存在的话,就往map里面存个值,key为shirt,value为280???欸,这么简单么?欸,就是这么简单。。。

如果shirt存在呢?你能一眼看出这行代码什么意思么?

map.computeIfAbsent("A", key -> new ArrayList<>()).add("a3");

相关链接

(147条消息) Map.computeIfAbsent(...)函数的使用_absent 函数_大東9_9的博客-CSDN博客
(147条消息) map 的 computeIfAbsent_map的computeifabsent_艾斯比的日常的博客-CSDN博客
(147条消息) Map中常用方法——computeIfAbsent方法_码到成功>_<的博客-CSDN博客

好的,现在你学会了1+1,我们来考微积分吧,如果你很闲的话,代码在后面,可以自己调试😂

@Data
public class Menu {
    private int id;
    private String name;
    private int parentId;
    private List<Menu> children;


    public Menu(int id, String name, int parentId) {
        this.id = id;
        this.name = name;
        this.parentId = parentId;
        this.children = new ArrayList<>();
    }

}
public class Test {

    public static void main(String[] args) {
        List<Menu> menuList = new ArrayList<>();
        menuList.add(new Menu(1, "Menu 1", 0));
        menuList.add(new Menu(2, "Menu 2", 0));
        menuList.add(new Menu(3, "Menu 3", 0));
        menuList.add(new Menu(4, "Menu 1-1", 1));
        menuList.add(new Menu(5, "Menu 1-2", 1));
        menuList.add(new Menu(6, "Menu 2-1", 2));
        menuList.add(new Menu(7, "Menu 2-1-1", 6));
        menuList.add(new Menu(8, "Menu 2-2", 2));
        menuList.add(new Menu(9, "Menu 3-1", 3));


        List<Menu> menus2 = buildMenuTree(menuList,0);
        List<Menu> menus1 = buildMenuTree(menuList);

        menus1.forEach(System.out::println);
        menus2.forEach(System.out::println);
    }


    public static List<Menu> buildMenuTree(List<Menu> menus, int parentId) {
        List<Menu> result = new ArrayList<>();
        for (Menu menu : menus) {
            if (menu.getParentId() == parentId) {
                List<Menu> children = buildMenuTree(menus, menu.getId());
                menu.setChildren(children);
                result.add(menu);
            }
        }
        return result;
    }


    public static List<Menu> buildMenuTree(List<Menu> menus) {
        Map<Integer, List<Menu>> map = new HashMap<>();
        for (Menu menu : menus) {
            Integer parentId = menu.getParentId();
            if (parentId != null) {
                List<Menu> children = map.computeIfAbsent(parentId, k -> new ArrayList<>());
                children.add(menu);
            }
        }
        return buildMenuTree(map, 0);
    }

    private static  List<Menu> buildMenuTree(Map<Integer, List<Menu>> map, Integer parentId) {
        List<Menu> children = map.get(parentId);
        if (children == null) {
            return null;
        }
        List<Menu> result = new ArrayList<>();
        for (Menu menu : children) {
            menu.setChildren(buildMenuTree(map, menu.getId()));
            result.add(menu);
        }
        return result;
    }

}

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

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

相关文章

Allegro如何使用自带的功能更改差分的线宽和间距操作指导

Allegro如何使用自带的功能更改差分的线宽和间距操作指导 在做PCB设计的时候,有时候PCB已经完成了布线,但是因为某些原因更改了层叠导致了差分的线宽和间距发生了变化,导致差分需要重新走一遍,如下图 如果差分数量比较多,重走是比较费时间的,Allegro自身有快速更新差分线…

服务器源码安装openssh7.4p1

系统环境&#xff1a; OS&#xff1a;Kylin-Server-10-SP2-x86-Release-Build09-20210524 软件版本&#xff1a;OpenSSH_8.2p1, OpenSSL 1.1.1f 一、源码安装升级 1、下载源码包 下载zlib-1.2.11.tar.gz、openssl-1.0.2k.tar.gz、openssh-7.4p1.tar.gz&#xff0c; openssl不…

【强化学习】一文弄懂,Q-learning和Sarsa的区别

一文弄懂&#xff0c;Q-learning和Sarsa的区别 2023.3.6 本文主要参考莫烦老师内容1. 理解Q_learning算法 主要看下面讲解&#xff0c;就不抄了&#xff1a; https://mofanpy.com/tutorials/machine-learning/reinforcement-learning/intro-q-learning 读懂几个内容&#xf…

旋转数组的几种做法

千淘万浪虽辛苦&#xff0c;吹尽黄沙始到金。 ——刘禹锡 第一种方法&#xff1a;遍历整个数组 题目描述&#xff1a; 一个数组A中存有N (N>0) 个整数&#xff0c;允许使用另外数组&#xff0c;将每个整数循环向右移动M(M>0)个位置。如果需要…

【Redis学习3】Redis四种模式之主从复制

主从复制模式 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。 前者称为主节点&#xff08;master&#xff09;&#xff0c;后者成为从节点&#xff08;slave&#xff09;&#xff1b;数据的复制是单向&#xff0c;主要是由主节点到从…

一把火烧掉了苹果摆脱中国制造的幻想,印度制造难担重任

这几年苹果不断推动印度制造&#xff0c;希望摆脱对中国制造的依赖&#xff0c;然而近期苹果在印度的一家代工厂发生大火却证明了苹果的这一计划遭受重大打击&#xff0c;印度制造根本就无法中国制造。一、印度制造屡屡发生幺蛾子苹果推动印度制造已有多年了&#xff0c;然而印…

Allegro如何刷新封装和库里的封装同步操作指导

Allegro如何刷新封装和库里的封装同步操作指导 在做PCB设计的过程中,有时会因为库里的封装有更新,所以PCB上使用到了这个封装时候需要和库里的同步,如下图 如何刷新,具体操作如下 点击Place点击Update Symbols

算法刷题-python版-最大回文子串

文章目录回文字符串如何判断是回文字符串求解字符串的最大回文子串暴力求解中心扩展&#xff08;比较优的方式&#xff09;两种方式性能对比回文字符串 正读、反读都是同一个字符串本身&#xff0c;这样的字符串就是回文字符串。 如 abccba 是回文字符串&#xff1b; 而 abcd …

产品EMC传导发射超标问题分析与整改

某产品在入网测试电磁骚扰项目中&#xff0c;直流电源端口&#xff08;DC端口&#xff09;传导发射测试超标严重&#xff0c;在低频150kHz~2MHz之间&#xff0c;某些频点超标10dBuV以上。经过对电源单板现场整改&#xff0c;再次测试DC端口传导发射顺利通过&#xff0c;余量在5…

准备好了吗?加入 GDE 成长计划,成为下一位谷歌开发者专家!

谷歌开发者专家 (Google Developer Experts&#xff0c;GDE)&#xff0c;又称谷歌开发者专家项目&#xff0c;是由一群经验丰富的技术专家、具有社交影响力的开发者和思想领袖组成的全球性社区。通过在各项活动演讲以及各个平台上发布优质内容来积极助力开发者、企业和技术社区…

C#基础篇

枚举enum 枚举的使用 using System.Net.Http.Headers; using System.Runtime.InteropServices; using System.Security.Cryptography;namespace game_code {enum E_MonsterType{Normal,// 普通怪Boos// Boos怪}internal class Program{static void Main(string[] args){// 枚…

Linux信号量详解

一、什么是信号量信号量的本质是一种数据操作锁、用来负责数据操作过程中的互斥、同步等功能。信号量就和互斥锁类似&#xff0c;本质上就是一个计数器&#xff08;全局变量&#xff09;。不同之处在于&#xff0c;互斥锁的值只有 2 个&#xff08;加锁 "lock" 和解锁…

Mysql Server原理简介

Mysql客户端包括JDBC、 Navicat、sqlyog&#xff0c;只是为了和mysql server建立连接&#xff0c;向mysql server提交sql语句。mysql server组件第一部分叫连接器主要承担的功能叫管理连接和验证权限&#xff0c;每次在进行数据库访问的时候&#xff0c;必然要输入用户名和密码…

421 Maximum login limit has been reached. on hdfs-over-ftp

使用 hdfs-over-ftp 时登录报错421 Maximum login limit has been reached. 本地测试连接第10个用户的时候会报这个异常 就是默认限制了用户登录数量。 DefaultConnectionConfig.java里private int maxLogins 10; 在HdfsOverFtpServer.java里修改了startServer()这个metho…

MSTP基础

MSTP基础引入背景技术概览PVSTP&#xff08;过渡&#xff09;MSTP单生成树的缺陷1&#xff1a;部分VLAN不通单生成树的缺陷2&#xff1a;无法实现流量的负载分担多生成树解决单生成树实例引入背景 RSTP在STP基础上进行了改进&#xff0c;实现了网络拓扑快速收敛。但由于局域网…

【redis学习篇】Redis三种持久化方式详解

官方文档 一、Redis持久性 Redis如何将数据写入磁盘 持久性是指将数据写入持久存储&#xff0c;如固态磁盘&#xff08;SSD&#xff09;。Redis提供了一系列持久性选项。其中包括&#xff1a; RDB&#xff08;快照&#xff09;&#xff1a;RDB持久性以指定的时间间隔执行数据…

程序员的上帝视角(4)——视角

对于开发人员来说&#xff0c;工作都是从评估一个需求开始。我们第一个要解决的问题就是看待需求的视角。视角的不同&#xff0c;得到的设计方案可能是完全不同的。作为一个程序员&#xff0c;不能单单从个人视角来看待问题。而是要尝试从不同角色出发&#xff0c;不停思考。上…

C++——内存管理

一&#xff0c;为什么要有内存管理因为在C/C中各个内置类型或者是自定义类型的大小都不一样&#xff0c;而如何让各个类型在内存中合理分布就非常有必要&#xff0c;由此我们就需要有内存管理。我们来看看下面这个程序中的各个变量都是如何分布的int globalVar 1; static int …

100种思维模型之混沌与秩序思维模型-027

人类崇尚秩序与连续性&#xff0c;我们习惯于我们的日常世界&#xff0c;它以线性方式运作&#xff0c;没有不连续或突跳。 为此&#xff0c;我们学会了期望各种过程以连续方式运行&#xff0c;我们的内心为了让我们更有安全感&#xff0c;把很多事物的结果归于秩序&#xff0c…

链表的中间结点与链表的倒数第k个结点(精美图示详解哦)

全文目录引言链表的中间结点题目描述与思路实现链表的倒数第k个结点题目描述与思路实现总结引言 在上一篇文章中&#xff0c;介绍了反转链表 我们利用了链表是逻辑连续的特点&#xff0c;逆置了链表的逻辑连接顺序&#xff0c;从而实现反转链表&#xff1a; 戳我查看反转链表详…