我有一个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()
答案 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