Streamy to potężne narzędzie, które pojawiło się wraz z nadejściem Javy 8. Można za ich pomocą rozwiązać bardzo wiele problemów, które na pierwszy rzut oka wydają się niemożliwe do rozwiązania z pomocą streamów. Jest to pierwszy z serii wpisów, gdzie postaram się zaprezentować ciekawe pomysły na ich zastosowanie.
Liczenie znaków
Zaczniemy od prostego problemu, jakim jest policzenie wystąpień poszczególnych znaków w stringu.
String s1 = "przykÅadowy ciÄ g znaków"; | |
Map<String, Long> map = Arrays.stream(s1.split("")) | |
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); | |
System.out.println(map); |
W wyniku otrzymamy mapę, której kluczem są znaki, a wartością ilość wystąpień w ciągu. W wyniku uruchomienia kodu otrzymamy wynik:
{ =2, a=2, ł=1, c=1, d=1, ą=1, g=1, i=1, k=2, n=1, o=1, p=1, r=1, ó=1, w=2, y=2, z=2}
Suma kolejnych liczb w ciągu Fibonacciego
Jest to rozwiązanie zadania programistycznego, gdzie trzeba było podać sumę n wyrazów ciągu Fibonacciego. Poza użyciem streamów jest to przykład zastosowania generatora, który dostarcza – generuje kolejne liczby ciągu. W zadaniu n mogło być duże, więc użyłem BigIntegerów.
public class Fibonacci { | |
private static class FibonacciGenerator { | |
private BigInteger nMinusTwo = BigInteger.ONE; | |
private BigInteger nMinusOne = BigInteger.ZERO; | |
public BigInteger next() { | |
final BigInteger n = nMinusTwo.add(nMinusOne); | |
nMinusTwo = nMinusOne; | |
nMinusOne = n; | |
return n; | |
} | |
} | |
public static void main(String[] args) { | |
BigInteger n = new BigInteger("10"); | |
BigInteger result = Stream.generate(new FibonacciGenerator()::next) | |
.limit(n.longValueExact()) | |
.reduce(BigInteger::add) | |
.get(); | |
System.out.println(result); | |
} | |
} |
Na razie to tyle, w przyszłości postaram się o więcej ciekawych przykładów.