Java8中Stream为什么要boxed

在介绍boxed前,先看下面一个案例

Java8中的有个生成随机数的Random类,先看下面代码,功能是生成100个随机数。数字在0到100之间。
Random random = new Random();
IntStream intStream = random.ints(0, 100);                 
intStream.limit(100).boxed().collect(Collectors.toList());

针对上面第二行和第三种代码个疑问:

  1. IntStream是什么类型? 和stream< Integer >什么区别。
  2. boxed()方法是做什么的。
第一个问题

IntStream是int类型的流。stream<Integer 是Integer类型的流。

第二个问题

看下boxed方法实现

@Override
public final Stream<Integer> boxed() {
    return mapToObj(Integer::valueOf);
}

IntStream是存的是int类型的stream,而Steam< Integer >是一个存了Integer的stream。boxed的作用就是将int类型的stream转成了Integer类型的Stream

比如下面这段代码就是很好理解了:

List<Integer> numbers = Arrays.asList(1, 2, 3, 3, 4, 5);
IntStream intStream = numbers.stream().mapToInt(i -> i);  //转成IntStream
Stream<Integer> boxed = intStream.boxed();                //转成Stream<Integer>

所以我们在用到这种原始int值的流,比如下面这种生成随机数的,得到IntStream在转成集合是不行的。会报错。

random.ints(0, 100).limit(10).collect(Collectors.toList()); //语法检测会报错

所以我们一定要把它转成Integer类型,像下面这种

random.ints(0, 100).limit(10).boxed().collect(Collectors.toList());
  • 34
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你可以使用 Java 8 Stream API 来查询 List 重复的数据。下面是一种实现方式: ```java List<String> myList = Arrays.asList("a", "b", "c", "a", "d", "b"); List<String> duplicates = myList.stream() .filter(i -> Collections.frequency(myList, i) > 1) .distinct() .collect(Collectors.toList()); ``` 在上面的代码,我们首先创建了一个包含重复元素的字符串列表 `myList`。然后,我们使用 `stream()` 方法将列表转换为一个流,使用 `filter()` 方法过滤出出现次数大于一的元素,使用 `distinct()` 方法去除重复元素,最后使用 `collect()` 方法将过滤后的元素收集到一个新的列表。 注意,上面的代码只能找到出现次数大于一的元素,并不能找到哪些元素重复出现了多次。如果你需要找到重复出现的元素和它们的出现次数,可以使用 Java 8 的 Map 和 Stream API,下面是一种实现方式: ```java List<String> myList = Arrays.asList("a", "b", "c", "a", "d", "b"); Map<String, Long> duplicates = myList.stream() .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) .entrySet() .stream() .filter(e -> e.getValue() > 1) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); ``` 在上面的代码,我们首先创建了一个包含重复元素的字符串列表 `myList`。然后,我们使用 `groupingBy()` 方法将列表的元素分组,每个元素作为键,出现次数作为值。接着,我们使用 `entrySet()` 方法将 Map 的键值对转换为一个流,使用 `filter()` 方法过滤出出现次数大于一的元素,最后使用 `toMap()` 方法将过滤后的元素收集到一个新的 Map ,其键是重复的元素,值是它们的出现次数。 注意,上面的代码只能找到重复出现的元素和它们的出现次数,不能找到哪些元素重复出现了多次。如果你需要找到哪些元素重复出现了多次,可以将上面的代码稍作修改,如下所示: ```java List<String> myList = Arrays.asList("a", "b", "c", "a", "d", "b"); Map<String, List<Integer>> duplicates = IntStream.range(0, myList.size()) .boxed() .collect(Collectors.groupingBy(myList::get, Collectors.mapping(Function.identity(), Collectors.toList()))) .entrySet() .stream() .filter(e -> e.getValue().size() > 1) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); ``` 在上面的代码,我们首先创建了一个包含重复元素的字符串列表 `myList`。然后,我们使用 `IntStream.range()` 方法生成一个包含列表下标的整数流,使用 `boxed()` 方法将整数流转换为一个包装类型流,接着使用 `groupingBy()` 方法将列表的元素分组,每个元素作为键,出现的位置作为值。接着,我们使用 `entrySet()` 方法将 Map 的键值对转换为一个流,使用 `filter()` 方法过滤出出现位置大于一的元素,最后使用 `toMap()` 方法将过滤后的元素收集到一个新的 Map ,其键是重复的元素,值是它们出现的位置列表。 注意,上面的代码可以找到哪些元素重复出现了多次,但不能找到每个元素重复出现的次数。如果你需要找到每个元素重复出现的次数和出现的位置列表,可以将上面的两段代码结合起来使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信仰_273993243

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值