List<>.stream().filter
时间: 2024-06-06 12:03:39 浏览: 91
List<>.stream().filter() 是 Java 8 新增的一种操作集合元素的方式。它的作用是对集合进行筛选操作,返回符合条件的元素集合。
具体来说,List<>.stream() 会返回一个流(Stream)对象,Stream 是 Java 8 中新增的一种用于操作集合的工具类。通过 Stream 对象可以对集合进行各种操作,比如筛选、排序、去重等等。而 filter() 方法则是 Stream 中提供的一个中间操作,用于对元素进行筛选。
filter() 方法接收一个 Predicate 接口类型的参数,Predicate 接口是一个函数式接口,它可以定义一个返回值为 boolean 类型的方法,用于判断某个元素是否符合条件。当 Predicate 中定义的方法返回 true 时,表示该元素符合条件,否则不符合条件。
下面是一个示例代码:
```
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
```
以上代码表示对整数列表 numbers 进行筛选,只保留其中的偶数元素,最终得到的 evenNumbers 列表就只包含了 2 和 4 两个元素。
相关问题
List<String> list= new ArrayList<>(); List<String> leaderId = departs.stream().filter(depart -> StringUtils.isNotBlank(depart.getFdLeaderId())).map(Depart::getFdLeaderId).collect(Collectors.toList()); List<String> etxLeaderId = departs.stream().filter(depart -> StringUtils.isNotBlank(depart.getFdLeaderExtId())).map(Depart::getFdLeaderExtId).collect(Collectors.toList()); list = account.stream().filter(departAccountVo -> StringUtils.isNotBlank(departAccountVo.getFdAccountId())).map(DepartAccountVo::getFdAccountId).collect(Collectors.toList()); list.addAll(leaderId); list.addAll(etxLeaderId); list = list.stream().distinct().collect(Collectors.toList()); 优化这段代码
可以使用链式调用的方式,避免重复的流操作,同时也可以在收集器中使用toSet()方法来去重。优化后的代码如下:
```
List<String> list = departs.stream()
.flatMap(depart -> Stream.of(depart.getFdLeaderId(), depart.getFdLeaderExtId()))
.filter(StringUtils::isNotBlank)
.distinct()
.collect(Collectors.toList());
list.addAll(account.stream()
.map(DepartAccountVo::getFdAccountId)
.filter(StringUtils::isNotBlank)
.collect(Collectors.toList()));
```
帮我优化以下代码:private static List<PxTopic> randomExamTopic(List<AbiIndicator> indicators, List<AbiIndicator> rootIndicators, int[][] randomTopicNum, List<PxTopic> topics) { List<PxTopic> res = new ArrayList<>(); for (AbiIndicator rootIndicator : rootIndicators) { List<AbiIndicator> secondIndicators = indicators.stream().filter(it -> rootIndicator.getId().equals(it.getParentId())).collect(Collectors.toList()); for (int i = 0; i < secondIndicators.size(); i++) { int[] topicNums = randomTopicNum[i]; for (int k = 0; k < topicNums.length; k++) { int topicNum = topicNums[k]; if (topicNum > 0) { List<PxTopic> randomTopics = getRandomTopics(topics, secondIndicators.get(i).getId(), k + 1, topicNum); res.addAll(randomTopics); } } } } return res; }
可以考虑以下优化:
1. 使用 foreach 循环代替 for 循环,因为 foreach 循环更加简洁易读。
2. 将第一个 for 循环和第二个 for 循环合并,减少循环嵌套。
3. 将获取随机题目的方法单独抽出来,使得代码更加模块化,易于维护。
改写后的代码示例如下:
```
private static List<PxTopic> randomExamTopic(List<AbiIndicator> indicators, List<AbiIndicator> rootIndicators, int[][] randomTopicNum, List<PxTopic> topics) {
List<PxTopic> res = new ArrayList<>();
for (AbiIndicator rootIndicator : rootIndicators) {
List<AbiIndicator> secondIndicators = indicators.stream().filter(it -> rootIndicator.getId().equals(it.getParentId())).collect(Collectors.toList());
for (AbiIndicator secondIndicator : secondIndicators) {
int[] topicNums = randomTopicNum[secondIndicators.indexOf(secondIndicator)];
for (int topicNum : topicNums) {
if (topicNum > 0) {
List<PxTopic> randomTopics = getRandomTopics(topics, secondIndicator.getId(), topicNums.indexOf(topicNum) + 1, topicNum);
res.addAll(randomTopics);
}
}
}
}
return res;
}
private static List<PxTopic> getRandomTopics(List<PxTopic> topics, String indicatorId, int level, int num) {
// TODO: 获取指定数量的随机题目
}
```
阅读全文