Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /usr/home/shadbb/domains/czub.info/public_html/wp-content/plugins/wp-syntax/wp-syntax.php on line 383

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]