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.
