我正在创建一个HashMap使用java8 streamAPI,如下所示:
Map<Integer, String> map = dao.findAll().stream()
.collect(Collectors.toMap(Entity::getType, Entity::getValue));
Run Code Online (Sandbox Code Playgroud)
现在,如果将一个元素添加到已存在该键的集合中,我只想将现有元素保留在列表中并跳过
附加元素.我怎样才能做到这一点?可能是我要利用BinaryOperation<U>的toMap(),但任何人都可以提供
我的具体案例的一个例子?
我有一个像下面这样的hashmap
Map<String, List<String>> map = new HashMap<>();
map.put("USA", Arrays.asList("CA","IA","IL"));
map.put("India", Arrays.asList("MUM","CAL"));
map.put("Canada", Arrays.asList("TOR"));
Run Code Online (Sandbox Code Playgroud)
我想根据值中升序排列的列表大小对地图进行排序.我该怎么做.有没有很好的方法呢?
我想获取一组对象(ObjectInstance在这种情况下),我想将它们分组为一个属性,并将结果列表排序在另一个属性上.
Set<ObjectInstance> beans = server.queryMBeans(null, null);
Map<String, List<String>> beansByDomain = beans.stream()
.collect(groupingBy( (ObjectInstance oi) -> oi.getObjectName().getDomain(),
mapping((ObjectInstance oi) -> oi.getObjectName().getCanonicalKeyPropertyListString(),
toList() )));
Run Code Online (Sandbox Code Playgroud)
上面的表达式创建了正确的数据结构:Map键是ObjectInstance对象的域,其中值是属性列表的列表.我想要的是现在对列表进行排序,以确保它们按字母顺序排列.有没有办法在同一个表达式中执行此操作?
一个想法是添加.sort()权后.stream(),但真正保证工作?
我想创建一个方法来创建一个元素流,这些元素是多个给定流的笛卡尔积(由二元运算符在末尾聚合到相同类型).请注意,参数和结果都是流,而不是集合.
例如,对于{A,B}和{X,Y}的两个流,我希望它生成值{AX,AY,BX,BY}的流(简单串联用于聚合字符串).到目前为止,我已经提出了这个代码:
private static <T> Stream<T> cartesian(BinaryOperator<T> aggregator, Stream<T>... streams) {
Stream<T> result = null;
for (Stream<T> stream : streams) {
if (result == null) {
result = stream;
} else {
result = result.flatMap(m -> stream.map(n -> aggregator.apply(m, n)));
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
这是我想要的用例:
Stream<String> result = cartesian(
(a, b) -> a + b,
Stream.of("A", "B"),
Stream.of("X", "Y")
);
System.out.println(result.collect(Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)
预期结果:AX, AY, BX, BY.
另一个例子:
Stream<String> result = …Run Code Online (Sandbox Code Playgroud) 我正在尝试将双打列表流式传输到a Map<Double, Double>,其中键是原始列表中的双打,并且值是一些计算值.
这就是我的代码:
// "values" is a List<Double> that was passed in
ImmutableMap<Double, Double> valueMap = values.parallelStream()
.collect(Collectors.toMap(p -> p, p -> doThing(values, p)));
private Double doThing(List<Double>, Double p) {
Double computedValue = 0.0;
// Do math here with p
return computedValue;
}
Run Code Online (Sandbox Code Playgroud)
然而,IntelliJ抱怨这p -> p不是一个有效的lambda表达式 - 它抱怨循环推理.我打电话时也遇到错误doThing,因为p是lambda参数而不是Double.
当我在调用中尝试强制p转换为无法投射时.DoubledoThing
我错过了一些非常明显的东西吗 似乎没有办法真正对我的lambda参数做任何事情......
在这个问题中,已经回答说两个表达式都是相同的,但在这种情况下它们会产生不同的结果.对于给定的int[] scores,为什么这有效:
Arrays.stream(scores)
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
......但这不是:
Arrays.asList(scores).stream()
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
据我所知,.stream()可以在任何Collection上调用,列表肯定是.第二个代码片段只返回一个包含整个数组的流而不是元素.
对这个问题有更好,更简单的方法吗?
@Test
public void testReduce() {
Set<Integer> foo = ImmutableSet.of(1,2,3,4,8,9);
Set<Integer> bar = ImmutableSet.of(1,3,8,5,11);
//DO think about solution for 1..n sets, and not only two.
Set<Integer> intersection = ImmutableList.of(foo,bar)
.stream()
.reduce( null, (a, b) -> {
if ( a == null ) {
a = new HashSet<Integer>(b);
}
else {
a.retainAll(b);
}
return a;
});
assertThat( intersection, is( ImmutableSet.of( 1,3,8) ) );
}
Run Code Online (Sandbox Code Playgroud) 我想实现以下使用流:
List<MyObject> list1 = Arrays.asList(obj1, obj2, obj3);
List<Boolean> list2 = Arrays.asList(true, false, true);
List<MyObject> list = new ArrayList<>();
for(int i=0; i<list1.size();i++) {
if(list2.get(i))
list.add(list1.get(i));
}
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?它应该很简单,但我是java流的新手.
注意: list1和list2的长度始终相同.
我想确定显示点集合所需的最小区域.简单的方法是循环遍历集合,如下所示:
int minX = Integer.MAX_VALUE;
int maxX = Integer.MIN_VALUE;
int minY = Integer.MAX_VALUE;
int maxY = Integer.MIN_VALUE;
for (Point point: points) {
if (point.x < minX) {
minX = point.x;
}
if (point.x > maxX) {
maxX = point.x;
}
if (point.y < minY) {
minY = point.y;
}
if (point.y > maxY) {
maxY = point.y;
}
}
Run Code Online (Sandbox Code Playgroud)
我开始了解溪流.要做到这一点,您可以执行以下操作:
int minX = points.stream().mapToInt(point -> point.x).min().orElse(-1);
int maxX = points.stream().mapToInt(point -> point.x).max().orElse(-1);
int minY = points.stream().mapToInt(point -> point.y).min().orElse(-1);
int maxY …Run Code Online (Sandbox Code Playgroud) int[] arr2 = new int[] {54, 432, 53, 21, 43};
Run Code Online (Sandbox Code Playgroud)
我正在使用它来排序,但它给出了一个错误.
Arrays.sort(arr2, (a, b) -> a - b);
Run Code Online (Sandbox Code Playgroud)
这也是一个错误.
arr2.sort((a, b) -> a - b);
Run Code Online (Sandbox Code Playgroud)