Java8中Stream為什麼要boxed
阿新 • • 發佈:2021-01-18
Java8中的有個生成隨機數的Random類,先看下面程式碼,功能是生成100個隨機數。數字在0到100之間。
Random random = new Random();
IntStream intStream = random.ints(0, 100);
intStream.limit(100).boxed().collect(Collectors.toList());
針對上面第二行和第三種程式碼個疑問:
- IntStream是什麼型別? 和stream什麼區別。
- boxed()方法是做什麼的。
第一個問題:IntStream是int型別的流。stream<Integer 是Integer型別的流。
第二個問題:先看下boxed方法實現。
@Override
public final Stream<Integer> boxed() {
return mapToObj(Integer::valueOf);
}
IntStream是存的是int型別的stream,而Steam是一個存了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型別,像下面這種使用boxed轉成了object型別
random. ints(0, 100).limit(10).boxed().collect(Collectors.toList());