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ż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);
view raw Letters.java hosted with ❤ by GitHub

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);
}
}
view raw Fibonacci.java hosted with ❤ by GitHub

Na razie to tyle, w przyszłości postaram 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 *