由于平时很少用到这种写法,导致每次看到有一脸懵逼,然后一段时间就要总结复习一次。。。。。。
如图所示
???这是什么牛马写法? 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;
}
}