我想使用Supplier和Stream.generate将带有通用列表的数组填充为元素.
看起来像这样:
Supplier<List<Object>> supplier = () -> new ArrayList<Object>();
List<Object>[] test = (List<Object>[]) Stream.generate(supplier).limit(m).toArray();
Run Code Online (Sandbox Code Playgroud)
错误输出为:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.util.List;
Run Code Online (Sandbox Code Playgroud)
现在,如何使用Java 8提供的技术填充具有泛型类型的数组?或者这是不可能的(还),我必须以"经典"的方式做到这一点?
此致,Claas M.
编辑
根据@ Water的要求,我使用stream.collect(使用Cast测试数组)和传统的迭代方法对填充数组/列表进行了一些性能测试.
首先使用列表进行性能测试:
private static int m = 100000;
/**
* Tests which way is faster for LISTS.
* Results:
* 1k Elements: about the same time (~5ms)
* 10k Elements: about the same time (~8ms)
* 100k Elements: new way about 1.5x as fast (~18ms vs ~27ms)
* …Run Code Online (Sandbox Code Playgroud) 我想将包含time属性的对象列表分组为5分钟,最好使用流和收集器.
我在StackOverflow上找到的唯一可能的解决方案是计算我需要多少个间隔(子列表),将每个对象添加到这些列表中的每一个,并过滤掉那些不适合相应时间范围的对象,这不是一个很好的解决方案.
(您可以在此处找到Thread:如何在Java 8中按另一个元素的元素对List的元素进行分组)
我想到了类似的东西:
List<MyObject> list = new ArrayList<MyObject>();
.......
List<List<MyObject>> grouped = list.stream().collect(Collectors.groupingBy(obj -> obj.getTime() / intervalLength));
Run Code Online (Sandbox Code Playgroud)
这当然是最重要的工作.
我希望随着Java 8及其功能的使用越来越多,我们可以为这样的问题找到一个suting解决方案.
此致,Claas M.
编辑:最后,我使用了@Harsh Poddar的解决方案并将Map转换为列表列表使用
for(Map.Entry<Integer, List<MyObject>> entry:map.entrySet())
list.add(entry.getValue());
Run Code Online (Sandbox Code Playgroud)
注意:之后必须对List进行排序.
在我的Web应用程序中,我用它ng-class="{highlighted_category: selected === category}"来突出显示一个条目.当我想使用时出现问题,例如pure-menu-selected因为它包含Angular由于某种原因不允许的破折号.
Error: [$parse:syntax] Syntax Error: Token '-' is unexpected, expecting [:] at column 6 of the expression [{pure-menu-selected: selected === category}] starting at [-menu-selected: selected === category}].
解决这个问题的优雅方法是什么?为什么Angular不允许在ngClass中使用破折号?
lambda ×2
angularjs ×1
arrays ×1
css ×1
generics ×1
java ×1
java-8 ×1
java-stream ×1
javascript ×1
list ×1