如何在Java中获得结果使用流?

如何在Java中获得结果使用流?,java,java-stream,Java,Java Stream,这里有一个字符串[] String[] strings = {"3", "1", "4", "3", "2"}; 我想把它改成一个数字,然后进行排序和累加运算 换号码 分类 累积运算 最后,我想将此代码更改为流 我曾尝试: String[] strings = {"3", "1", "4", "3", "2

这里有一个字符串[]

String[] strings = {"3", "1", "4", "3", "2"};
我想把它改成一个数字,然后进行排序和累加运算

  • 换号码
  • 分类
  • 累积运算
  • 最后,我想将此代码更改为流

    我曾尝试:

    String[] strings = {"3", "1", "4", "3", "2"};
                
    int asInt = stream(strings)
                    .mapToInt(Integer::parseInt)
                    .sorted()
                    .reduce(Integer::sum)
                    .getAsInt();
    

    我应该怎么做才能得到我想要的结果?

    几乎可以肯定有更好的方法,但在有人给出更好的方法之前,这是一个快速解决方案:

    final int[]index={strings.length};
    最终int结果=Arrays.stream(字符串)
    .mapToInt(整数::parseInt)
    .已排序()
    .减少(0,(a,b)->a+(索引[0]-*b));
    
    这里的想法是,你想要的数字是第一个数5次,第二个数4次,第三个数3次,以此类推


    使用
    final int[]
    作为基本变量,可以在流中使用(必须是
    final
    )<代码>索引[0]--在每一步上确保下一步乘以更少的值。

    几乎肯定有更好的方法,但在有人给出更好的方法之前,这是一个快速解决方案:

    String[] strings = {"3", "1", "4", "3", "2"};
    AtomicInteger ai = new AtomicInteger();
    
    Arrays.stream(strings)
          .mapToInt(Integer::parseInt)
          .sorted()
          .map(ai::addAndGet).sum();  // returns 32
    
    final int[]index={strings.length};
    最终int结果=Arrays.stream(字符串)
    .mapToInt(整数::parseInt)
    .已排序()
    .减少(0,(a,b)->a+(索引[0]-*b));
    
    这里的想法是,你想要的数字是第一个数5次,第二个数4次,第三个数3次,以此类推


    使用
    final int[]
    作为基本变量,可以在流中使用(必须是
    final
    )<代码>索引[0]--在每一步上确保下一步乘以更少的值。

    一个明确、直接的解决方案:

    String[] strings = {"3", "1", "4", "3", "2"};
    AtomicInteger ai = new AtomicInteger();
    
    Arrays.stream(strings)
          .mapToInt(Integer::parseInt)
          .sorted()
          .map(ai::addAndGet).sum();  // returns 32
    
  • 映射
    排序
    数组
  • 每次创建一个数组长度为1的
    IntStream
    ,并
    sum
    第一个i元素
    sum
  • 代码:

    输出:

    32
    

    一个明确、直截了当的解决方案:

  • 映射
    排序
    数组
  • 每次创建一个数组长度为1的
    IntStream
    ,并
    sum
    第一个i元素
    sum
  • 代码:

    输出:

    32
    

    要简单地进行转换,请尝试对两个循环使用
    IntStream.range…
    。唯一应该做的是使用正确的操作。
    Integer::sum
    的作用是对流中的元素求和。在定义操作时,需要打破流的功能优势(访问完整流以获得结果)。可能可以通过某种方式对其进行排序,使其能够进行流式转换。要简单地进行转换,请尝试对两个循环使用
    IntStream.range…
    。您唯一应该做的是使用正确的操作。
    Integer::sum
    的作用是对流中的元素求和。在定义操作时,需要打破流的功能优势(访问完整流以获得结果)。可能可以通过某种方式对其进行排序以使其可流化。无需使用
    reduce
    只需在
    map(ai::addAndGet)
    @Eritrean之后使用
    sum()
    ,对于
    AtomicInteger
    ,您将需要
    reduce()
    sum()
    除非进行另一次转换,否则无法工作before@VictorPoloDeGyvesMontero不可以。您可以使用
    map(ai::addAndGet).sum()
    ,因为在这一点上,流是
    IntStream
    ,所以您可以使用
    sum()
    Fixed从@gauthamm添加注释无需
    reduce
    只需使用
    sum()
    映射(ai::addAndGet)
    @Eritrean for
    AtomicInteger
    之后,您需要
    reduce()
    sum()
    将无法工作,除非完成另一次转换before@VictorPoloDeGyvesMontero不可以。您可以使用
    map(ai::addAndGet).sum()
    因为此时流是
    IntStream
    ,所以您可以使用
    sum()
    Fixed添加@GauthamMI的注释,我从您的想法中学到了很多。非常感谢你。我从你的想法中学到了很多。非常感谢你。
    String[] strings = {"3", "1", "4", "3", "2"};
                
    int asInt = stream(strings)
                    .mapToInt(Integer::parseInt)
                    .sorted()
                    .reduce(Integer::sum)
                    .getAsInt();
    
    asInt = 13
    
    String[] strings = {"3", "1", "4", "3", "2"};
    AtomicInteger ai = new AtomicInteger();
    
    Arrays.stream(strings)
          .mapToInt(Integer::parseInt)
          .sorted()
          .map(ai::addAndGet).sum();  // returns 32
    
    String[] strings = {"3", "1", "4", "3", "2"};
    
    int[] ints = Arrays.stream(strings)
            .mapToInt(Integer::parseInt)
            .sorted()
            .toArray();
    
    int cumulativeSum = IntStream.rangeClosed(1, ints.length)
            .map(i -> Arrays.stream(ints)
                    .limit(i)
                    .sum())
            .sum();
    
    32