juststuck:
Por lo tanto, la forma de obtener los resultados de este código usando la programación funcional:
public static final List<BigDecimal> numbers = Arrays.asList(
new BigDecimal("15"), new BigDecimal("10"), new BigDecimal("17"),
new BigDecimal("30"), new BigDecimal("18"), new BigDecimal("23"),
new BigDecimal("5"), new BigDecimal("12") );
BigDecimal totalOfReducedNumbers = BigDecimal.ZERO;
for(BigDecimal number : numbers) {
if(number.compareTo(BigDecimal.valueOf(20)) > 0)
totalOfReducedNumbers =
totalOfReducedNumbers.add(number.multiply(BigDecimal.valueOf(0.9)));
}
System.out.println("Total of reduced numbers: " + totalOfReducedNumbers);
Lo que arroja a cabo " total de un número reducido: 47.7 "
¿Cómo obtener el mismo resultado utilizando herramientas de programación funcionales como mapa (), reducir (), etc?
Ousmane D .:
El bucle de aplicación es un típico "reducir" patrón (también conocido como "doblar", modelo "agregado" en algunos otros idiomas)
Usted está buscando filter
-> reduce
método:
BigDecimal reduce =
numbers.stream()
.filter(n -> n.compareTo(BigDecimal.valueOf(20)) > 0)
.reduce(BigDecimal.ZERO,
(a, b) -> a.add(b.multiply(BigDecimal.valueOf(0.9))));
Puede minimizar aún más el número de objetos contructed por el almacenamiento en caché BigDecimal.valueOf(20)
y BigDecimal.valueOf(0.9)
como se muestra en @ es decir, la respuesta de Elliot:
BigDecimal TWENTY = BigDecimal.valueOf(20);
BigDecimal POINT9 = BigDecimal.valueOf(0.9);
BigDecimal reduce =
numbers.stream()
.filter(n -> n.compareTo(TWENTY) > 0)
.reduce(BigDecimal.ZERO,
(a, b) -> a.add(b.multiply(POINT9)));