1. 程式人生 > 其它 >Java8中Stream為什麼要boxed

Java8中Stream為什麼要boxed

技術標籤:JDKjavarandom

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什麼區別。
  2. 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());