Tak, na szybko. Przykład sortowania danych z użyciem wywołań lambda. Skraca to zapis kodu oraz poprawia czytelność (pod warunkiem że się z odpowiednio sformatuje kod).
Poniżej 3 przykłady:
- Sortowanie tablicy tekstów według długości teksu
- Sortowania tablicy tekstów według ostatniego znaku
- Sortowania mapy gdzie mamy klucz oraz zbór losowych wartości. Sortowane są według średniej arytmetycznej
Czemu takie a nie inne, często podczas obróbki danych zachodzi konieczność posortowania wyników oraz wybrania np 10 najlepszych lub najgorszych. Oczywiście można to zrealizować przy pomocy zapytań SQL lub innych metod, ale prostych przykładów nigdy za wiele.
A teraz kod:
package net.shad.lernjava8; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; /** * * @author Jarek */ public class Java8SortArray { public static void main(String[] args){ Java8SortArray l=new Java8SortArray(); l.testSort(); l.testSort2(); l.testSort3(); } /** * * @return */ private String[] getArray(){ String[] stringArray={"jeden", "dwa", "trzy", "cztery", "pięć", "sześć", "siedem"}; return stringArray; } /** * Generuje losowo wypełnioną mape * * @return */ private Map<String, List<Integer>> getMap(){ Map<String, List<Integer>> multiMap=new HashMap<>(); for (int i=0; i < 10; i++){ List<Integer> list=new ArrayList<>(); for (int j=0; j < 2; j++){ list.add((int)(Math.random()*1000)); } multiMap.put("idx_" + i, list); } return multiMap; } /** * Sortuje tablicę po ilości znaków w tekście */ public void testSort(){ System.out.println("================================="); System.out.println(" Sort String by Lenght "); System.out.println("================================="); String[] stringArray=getArray(); // // Sortowanie przy użyciu lambdy // Arrays.sort(stringArray, (string1, string2) -> string1.length() - string2.length() ); // // Dukowanie zawartości przy pomocy stream'a // Arrays.asList(stringArray) .stream() .forEach(s -> System.out.println(s)); } /** * Sortuje tablicę według ostatniego znaku */ public void testSort2(){ System.out.println("================================="); System.out.println(" Sort String by Last Character "); System.out.println("================================="); String[] stringArray=getArray(); // // Sortowanie przy użyciu lambdy // Arrays.sort(stringArray, (string1, string2) -> string1.charAt(string1.length() - 1) - string2.charAt(string2.length() - 1) ); // // Dukowanie zawartości przy pomocy stream'a // Arrays.asList(stringArray) .stream() .forEach(s -> System.out.println(s)); } /** * Sortuje mapę według średnich wartości na liście */ private void testSort3(){ Map<String, List<Integer>> map=getMap(); System.out.println("================================="); System.out.println(" Sort Map by Average Value "); System.out.println("================================="); map.entrySet() .stream() .map(s->new Object[]{ s.getKey(), s.getValue() .stream() .mapToDouble(Integer::doubleValue) .average() .orElse(0) } ) .sorted( (array1, array2) -> (int) Float.parseFloat(array1[1].toString()) - (int) Float.parseFloat(array2[1].toString()) ) .map(s -> Arrays.toString(s)) .forEach(s -> System.out.println(s)); } } |
Wynikiem działania jest:
================================= Sort String by Lenght ================================= dwa trzy pięć jeden sześć cztery siedem ================================= Sort String by Last Character ================================= dwa siedem jeden trzy cztery pięć sześć ================================= Sort Map by Average Value ================================= [idx_2, 151.5] [idx_3, 391.0] [idx_1, 501.5] [idx_9, 567.0] [idx_8, 604.5] [idx_0, 673.0] [idx_5, 686.0] [idx_6, 767.0] [idx_4, 863.5] [idx_7, 945.0]
Możliwość komentowania jest wyłączona.