2015-01-19 2 views
0

У меня есть классПерерыв массив междунар на поток

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); 
    } 
} 

ответ

5

Если вы хотите, чтобы общая длина массивов miniTargets:

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

Если вы хотите IntStream содержащий miniTargets:

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

Вы не хотите count(), вы w ant sum(). См. Мой ответ – user2336315

+0

, и если я хочу преобразовать его в поток int - как я могу его достичь? –

+2

@ li-raz Что должен содержать этот поток int? Все элементы массивов miniTargets? – Eran

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); 
+0

это, конечно, просто хотелось поиграть с ним –

Смежные вопросы