2017-10-16 6 views
2

Je dois calculer la somme de Iterable<Integer>.Calculer SumOfInts à partir Iterable

final Iterable<Integer> score = this.points() 
final sum = new SumOfInts(...).value() 

Comment puis-je faire cela en utilisant la classe SumOfInts?

+0

où est la mise en œuvre de SumOfInts? –

+0

@DanyalSandeelo [ici] (https://github.com/yegor256/cactoos/blob/master/src/main/java/org/cactoos/iterable/SumOfInts.java). Inspiré par les tags de la question. – thanopi57

+1

Vous devez d'abord convertir le 'Iterable >' en un 'Iterable >', ou avec Java 8: 'score.stream(). MapToInt (i -> i) .sum();'. – assylias

Répondre

2

Si je comprends bien votre question, vous pouvez additionner l'itérable en utilisant un code similaire à cet exemple :;

final Iterable<Integer> score = Arrays.asList(1, 2, 3, 4); 
Optional<Integer> sum = StreamSupport.stream(score.spliterator(), false).reduce((i1, i2) -> i1 + i2); 
System.out.println(sum.get()); 

Le résultat imprimé est la suivante:

10 

Explication:

Iterable peut être converti en un spliterator et spliterator de flux. Vous pouvez ensuite effectuer des réductions sur le flux.

Dès que vous avez le flux, vous pouvez résoudre la réduction de plusieurs façons.

Une autre alternative:

int summed = StreamSupport.stream(score.spliterator(), false).mapToInt(Integer::intValue).sum(); 
System.out.println(summed); 

Ceci est peut-être plus agréable, comme vous vous débarrasser du résultat Optional.

0

Je n'ai pas trouvé d'exemples de la façon de convertir Integer en Scalar<Number> mais puisque le Scalar est une interface, vous pouvez faire quelque chose comme ça.

public long sum() throws Exception { 
    final List<Scalar<Number>> score = this.points() 
      .stream() 
      .map(this::toScalar) 
      .collect(Collectors.toList()); 
    return new SumOfInts(score).value(); 
} 

private Scalar<Number> toScalar(final Number number) { 
    return() -> number; 
} 

Mais je parie qu'il y a un meilleur moyen.