使用流

时间:2016-01-05 13:04:56

标签: java functional-programming instantiation java-stream

我有一个int数组,我想用它来实例化一个数组或一个对象列表。在我的情况下,做旧的方式是:

int[] layer_sizes = {784, 500, 10};
Layer[] layers = new Layer[layer_sizes.length];
for (int i=0; i<layer_sizes.length; i++)
    layers[i] = new Layer(layer_sizes[i]);

但现在我看到Java 8拥有所有这些奇特的流。我现在想做像Python的列表推导这样的事情:

List<Layer> layers = Stream.of(layer_sizes).map(size -> Layer(size));

但它不允许我这样做,我不知道为什么......它给出的信息是

incompatible types: no instance(s) of type variable(s) R exist so that Stream<R> comforms to List<Layer> where R, T are type variables....

有没有办法使用Streams在一行中构造一个对象数组?

编辑:与先前的问题不重复,因为事实证明从基元制作流有一些特点。

结论

谢谢Sam Sun和Eran。我最终使用的这条线是:

Layer[] layers = Arrays.stream(layer_sizes).boxed().map(Layer::new).toArray(Layer[]::new);

无论盒装()是什么,你都需要它,除非你将layer_sizes声明为Integer而不是int

P.S。如果java开发人员正在阅读这篇文章,那么对于Java 9或其他类似的东西来说,这将是非常令人惊奇的

Layer[] layers = {new Layer(size) for (size:layer_sizes)}  // OR at least:
Layer[] layers = Stream.of(layer_sizes).map(Layer::new).toArray()

2 个答案:

答案 0 :(得分:3)

您缺少两件事 - 将Stream收集到List中并调用class UIViewController { var mapDrive = MapDrive() func initializeMapResolution() { // Instantiate map drive, assign it to self.mapDrive //then assign the delegate of the property on self. self.mapDrive.delegate = self } } 构造函数(您缺少Layer关键字):

new

如果您希望输出为数组而不是List<Layer> layers = IntStream.of(layer_sizes) .mapToObj(size -> new Layer(size)) .collect(Collectors.toList()); ,请拨打List而不是toArray

编辑:

我刚刚意识到collect传递Stream.of时会生成int[],而不是Stream<int[]>。因此,您应该使用Stream<Integer>来处理原始IntStream元素。

另一种方法是将输入int替换为int[] layer_sizes = {784, 500, 10};

答案 1 :(得分:3)

Eran的回答总体上说明了该怎么做,但缺少一些关键细节。

angular.module("todoApp").constant("CSRF_TOKEN", '{!! csrf_token() !!}'); 上使用 thisApp.addTodo = function(note) { console.log($scope.note); $http({ method : 'POST', url : 'http://localhost:8000/notes', data : $.param($scope.note), headers : {'Content-Type': 'application/x-www-form-urlencoded', 'x-csrf-token': CSRF_TOKEN} }); 会产生Stream.of; Java的神奇工具之一。

相反,您应该使用int[]Stream<int[]>来获取Arrays.stream(请记住,原语不能作为参数)。

对于IntStream.of操作,您可以使用IntStream的方法参考。

这一切归结为这个新的snippit

map