功能编程如何在这里更好(Java 8)

时间:2016-12-28 11:21:59

标签: java functional-programming java-8 java-stream

public class Main2 {

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(2,4,3,-5,-7);

        Collections.sort(list);

        int i = 0;
        int j = list.size()-1;

        int min = 1000;

        while (true) {
             int sum = list.get(i)+list.get(j);

             if (mod(sum) < min) {
                 min = mod(sum);
             }
             if (sum < 0) {
                 i++;
             }
             else if (sum ==0 ) {
                 i++;
                 j--;
             }
             else {
                 j--;
             }

             if (j <= i) {
                 break;
             }
        }

        System.out.println(min);

    }
    private static int mod(int sum) {
        return sum < 0 ? -sum : sum;
    }
}

上面的代码是通过添加任意两个元素来找到最接近零的和。但我无法弄清楚如何(不使用循环)流将有助于编写更清晰,可读的代码。如果没有太多逻辑,我在内部循环中看到了什么,然后使用流使代码更清晰。

1 个答案:

答案 0 :(得分:2)

您可以对列表进行流式传输,然后flatMap再次针对相同的流列表,然后使用流的min方法。 代码肯定会更短,但无论是否更容易阅读都是在旁观者眼中:

int min = list.stream()
              .flatMapToInt(i -> list.stream()
                                     .filter(j -> !i.equals(j))
                                     .mapToInt(j -> i + j)
                           )
              .map(Math::abs)
              .min()
              .getAsInt();