标签: java-stream

如何使用流重写重复项来创建HashMap?

我正在创建一个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(),但任何人都可以提供

我的具体案例的一个例子?

java java-8 java-stream

9
推荐指数
1
解决办法
1212
查看次数

如何根据值List的大小对java中的HashMap进行排序

我有一个像下面这样的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)

我想根据值中升序排列的列表大小对地图进行排序.我该怎么做.有没有很好的方法呢?

java sorting java-8 java-stream

9
推荐指数
1
解决办法
5666
查看次数

如何使用java 8将一组对象分组为排序列表?

我想获取一组对象(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(),但真正保证工作?

java sorting lambda grouping java-stream

9
推荐指数
2
解决办法
9371
查看次数

Java 8中流的笛卡尔积作为流(仅使用流)

我想创建一个方法来创建一个元素流,这些元素是多个给定流的笛卡尔积(由二元运算符在末尾聚合到相同类型).请注意,参数和结果都是流,而不是集合.

例如,对于{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)

java set cartesian-product java-8 java-stream

9
推荐指数
1
解决办法
3538
查看次数

如何将lambda参数转换为可用对象?

我正在尝试将双打列表流式传输到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参数做任何事情......

java lambda java-8 java-stream

9
推荐指数
1
解决办法
2485
查看次数

Arrays.stream(array)vs Arrays.asList(array).stream()

在这个问题中,已经回答说两个表达式都是相同的,但在这种情况下它们会产生不同的结果.对于给定的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上调用,列表肯定是.第二个代码片段只返回一个包含整个数组的流而不是元素.

java arrays foreach java-8 java-stream

9
推荐指数
2
解决办法
3067
查看次数

集流的交集成新集

对这个问题有更好,更简单的方法吗?

@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)

java-8 java-stream

9
推荐指数
1
解决办法
4942
查看次数

同时迭代两个列表并使用流创建另一个列表

我想实现以下使用流:

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的长度始终相同.

java lambda java-stream

9
推荐指数
1
解决办法
1万
查看次数

如何使用单个流操作从对象获取多个值?

我想确定显示点集合所需的最小区域.简单的方法是循环遍历集合,如下所示:

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)

java java-8 java-stream

9
推荐指数
3
解决办法
221
查看次数

如何在java中仅使用lambda按升序和降序对整数数组进行排序

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)

java arrays lambda java-8 java-stream

9
推荐指数
3
解决办法
4417
查看次数