Ciekawe przykłady zastosowania streamów w Javie

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żlie do rozwiązania z pomocą streamów. Jest to pierwszy z serii wpisów gdzie postaram się zaprezentować ciekawe pomysły na zastosowanie streamów.

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żytko BigIntegerów.

public class CountLetters {

    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 postram się o więcej ciekawych przykładów.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *