java四大函数式接口-1(Function函数)举例:computeIfAbsent() 方法的使用

  1. 功能性接口:Function 接收一个功能参数t,并返回一个功能结果R。

2.

3.

4.

原文

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

如图所示

首先,我们先把这行代码还原,Function<String, String> toUpperCase = str -> str.toUpperCase();

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

此时idea爆红提示这是一个接口,不能直接new。我们使用匿名内部类来进行对象定义

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

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

使用匿名内部类实现该接口时重写里面定义的方法

使用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???欸,这么简单么?欸,就是这么简单。。。

https://blog.csdn.net/Rice_kil/article/details/121402989

相关链接

(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;
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值