Java 8 流 : Analyze same list elements

标签 java lambda java-8 java-stream

代码解释得更好:

测试用例

@org.junit.Test
public void test() {
    List<Integer> values = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);

    System.out.println(withoutStreams(values)); // Output: 1,9
    System.out.println(withStreamSol1Error(values)); // Compile time error
    System.out.println(withStreamSol2(values)); // Output: 1,9
}

所需解决方案(无流):

private List<Integer> withoutStreams(List<Integer> values) {
    // List<Integer> values = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);

    for (int index1 = 0; index1 < values.size(); index1++) {
        int value1 = values.get(index1);
        if (value1 == 10)
            return Arrays.asList(value1);
        for (int index2 = index1 + 1; index2 < values.size(); index2++) {
            int value2 = values.get(index2);

            if ((value1 + value2) == 10) {
                return Arrays.asList(value1, value2);
            }
        }
    }

    return Collections.emptyList();
}

我的尝试:使用流:(编译时错误 - 不匹配)

private List<Integer> withStreamSol1Error(List<Integer> values) {
    List<Integer> exactEqual = values.stream().filter(value -> value.intValue() == 10).limit(1)
            .collect(Collectors.toList());

    // Compile Time Error
    if (exactEqual.isEmpty()) {
        IntStream.range(0, values.size() - 1)
                .forEachOrdered(index -> IntStream.range(index + 1, values.size() - 1)
                        .filter(index2 -> values.get(index) + values.get(index2) == 10).limit(1)
                        .collect(Collectors.toList()));
    }

    return Collections.emptyList();
}

使用流(工作)

private List<Integer> withStreamSol2(List<Integer> values) {
    List<Integer> exactEqual = values.stream().filter(value -> value.intValue() == 10).limit(1)
            .collect(Collectors.toList());

    int index1 = 0;
    final List<Integer> result = new ArrayList<>();
    if (exactEqual.isEmpty()) {
        values.stream().forEach(value1 -> {
            if(!result.isEmpty()) // Query: How can stop outer forEach
                return;

            result.add(value1);
            result.addAll(values.stream().skip(index1).filter(value2 -> (value1 + value2) == 10).limit(1)
                    .collect(Collectors.toList()));
        });
    }

    return result;
}

有人可以为这个问题提出一个好的解决方案吗?

最佳答案

private static List<Integer> withStreamSol1(List<Integer> values) {
    List<Integer> result = new ArrayList<>();
    values.stream()
        .filter(i -> result.isEmpty() && i == 10)
        .forEach(i -> result.add(i));
    IntStream.range(0, values.size())
        .filter(i -> result.isEmpty())
        .forEach(i -> IntStream.range(i + 1, values.size())
            .filter(j -> result.isEmpty() && values.get(i) + values.get(j) == 10)
            .forEach(j -> result.addAll(Arrays.asList(values.get(i), values.get(j)))));
    return result;
}

或者

private static Stream<int[]> streamOfOneOrTwoElements(List<Integer> list) {
    return Stream.concat(
        list.stream()
            .map(i -> new int[] {i}),
        IntStream.range(0, list.size())
            .boxed()
            .flatMap(i -> IntStream.range(i + 1, list.size())
                .mapToObj(j -> new int[] {list.get(i), list.get(j)})));
}

private static List<Integer> withStreamSol3(List<Integer> values) {
    Optional<int[]> array = streamOfOneOrTwoElements(values)
        .filter(a -> IntStream.of(a).sum() == 10)
        .findFirst();
    return array.isPresent()
        ? IntStream.of(array.get()).boxed().collect(Collectors.toList())
        : Collections.emptyList();
}

关于Java 8 流 : Analyze same list elements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31121128/

相关文章:

java - FunctionalInterface Comparator 有 2 个抽象方法

linq - 使用 Linq 或 Lambda 表达式的 SQL 之间的等效语句

java - 是否可以使用 Nashorn 将 Java 代码转换为 Javascript?

java - Gson使用Highcharts获取饼图的Json值

java - 根据复杂的逻辑更新列表

java - Java 8中String和Integer的父类(super class)

java - 如何检查一个 ArrayList of Strings 是否包含另一个 ArrayList of Strings 的子字符串?

java - 使用 SonarQube 进行分析会导致 0 个文件被索引并且没有报告(Maven 项目)

java - 如何在 spring boot 中启用/禁用特定的休息端点?

java - 创建将调用父类(super class)方法的非捕获方法引用