请教一下关于 lamdba 的用法

2018-03-22 14:47:22 +08:00
 zhazi
@Data
class User {
    Integer id;
    Integer parentId;
    List<User> userList;

    public User(Integer id, Integer parentId) {
        this.id = id;
        this.parentId = parentId;
    }

    public static void main(String[] args) {
        List<User> userList = new ArrayList<>();
        userList.add(new User(1, null));
        userList.add(new User(2, 1));
        userList.add(new User(3, 1));
    }
}

请教一下怎样使用 lamdba 将 u2u3 set 到 u1 里
用 lamdba 总用不好
2965 次点击
所在节点    Java
11 条回复
MinQ
2018-03-22 15:01:50 +08:00
等等不是 lambda 么?
yidinghe
2018-03-22 15:02:45 +08:00
这个用不到 lambda 表达式,但我猜你是想要这样:

```java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class User {

private int id;

private int parentId;

private List<User> userList = new ArrayList<>();

public User(int id, User... users) {
this.id = id;
this.userList.addAll(Arrays.asList(users));
this.userList.forEach(u -> u.parentId = id);
}

public static void main(String[] args) {
User root = new User(1,
new User(2,
new User(3),
new User(4)),
new User(5,
new User(6)
)
);
}
}
```
yidinghe
2018-03-22 15:04:37 +08:00
为什么回复不能用 markdown........
算了贴到别地方 https://gitee.com/yidinghe/codes/u3w7r5qz2ikxp9hotcd1n41
zhazi
2018-03-22 15:19:38 +08:00
@yidinghe 结构是这样的,但是我数据是从数据库取的一个 List<User>里面有 parent 节点和 child 节点,我不想一层又一层遍历,我觉得 stream 应该能处理这样的需求
yidinghe
2018-03-22 15:30:18 +08:00
@zhazi 没看懂你到底想得到什么,要不你先用标准写法写完,然后再看看怎么改。
zhazi
2018-03-22 15:40:31 +08:00
@yidinghe 我在主题上补充了一下,麻烦你看下,谢谢
yidinghe
2018-03-22 15:47:42 +08:00
哦 这就是将集合元素构建成树结构,我这里给个现成的例子:
https://gitee.com/yidinghe/codes/q6lbevnaru5m08fixcw4740
leafin
2018-03-22 17:24:09 +08:00
试试这个
List<User> userList = userResource.stream()
.peek(u -> u.setUserList(userResource.stream()
.filter(su -> Objects.equals(u.getId(), su.getParentId()))
.collect(toList())))
.filter(u -> u.getParentId() == null)
.collect(toList());
zacard
2018-03-22 17:46:47 +08:00
private Set<User> something(List<User> userResource) {
Map<Integer, List<User>> groupMap = userResource.stream()
.collect(Collectors.groupingBy(User::getParentId, Collectors.toList()));
Map<Integer, User> rootMap = groupMap.remove(null).stream()
.collect(Collectors.toMap(User::getId, Function.identity()));
groupMap.forEach((k, v) -> rootMap.get(k).setUserList(v));
return new HashSet<>(rootMap.values());
}


没有测试过,不过大致是这个思路
waltyyy
2018-03-29 11:21:49 +08:00
```
Map<Integer, List<User>> parentIdUserMap = userResource.stream()
.filter(u -> u.getParentId() != null)
.collect(groupingBy(User::getParentId));

userResource.stream().filter(u -> u.getParentId() == null).map(u -> {
u.setUserList(parentIdUserMap.get(u.getId()));
return u;
}).collect(toList());
```
ng14
2018-05-24 17:54:31 +08:00
@yidinghe 我觉得差不多

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/440436

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX