将int数组中断为流

时间:2015-01-19 15:01:16

标签: java java-8 java-stream

我有一个班级

public class Targets {
    public int[] miniTargets;

    public Targets(int t) {
        miniTargets = new int[t];
        for (int i = 0; i < t; i++) {
            miniTargets[i] = t;
        }
    }
}

我想知道miniTargets收藏中我有多少Targets 但我坚持使用flatMap

public class App {
    public static void main(String[] args) {
        List<Targets> lst = new ArrayList<Targets>();
        lst.add(new Targets(5));
        lst.add(new Targets(15));
        lst.add(new Targets(25));

        int cnt = (int)lst.stream().map(tg -> tg.miniTargets).flatMap(...).count()
        System.out.println(cnt);
    }
}

2 个答案:

答案 0 :(得分:5)

如果您想要miniTargets数组的总长度:

int cnt = lst.stream()
             .mapToInt(tg -> tg.miniTargets.length)
             .sum();

如果你想要一个包含miniTargets的IntStream:

IntStream minis = lst.stream()
                     .flatMapToInt (tg -> IntStream.of(tg.miniTargets));

答案 1 :(得分:3)

您不需要使用flatMap。只需使用每个数组的长度调用mapToInt,然后调用sum()

int cnt = lst.stream().mapToInt(tg -> tg.miniTargets.length).sum();

虽然您可能想要使用访问器并封装数据:

class Targets {
   private miniTargets;
   ...
   public int size() {
       return miniTargets.length;
   }
}

然后它会来:

int cnt = lst.stream().mapToInt(Targets::size).sum();

如果你想要一个IntStream将所有的值,你可以这样做:

IntStream allValues = lst.stream()
                         .map(tg -> tg.miniTargets)
                         .flatMapToInt(Arrays::stream);