Latest web development tutorials

Java 8 Stream

Java 8 nowych funkcji Java 8 nowych funkcji


Java 8 API dodaje nowy abstrakcję nazwie Strumień Strumień, pozwala na przetwarzanie danych w sposób deklaratywny.

Stream używa podobnego SQL kwerendy danych z bazy danych w intuicyjny sposób, aby zapewnić wyższy poziom abstrakcji i ekspresji Java zestaw operacji.

Stream API może znacznie zapewnić programista Java produktywność, umożliwiając programistom pisać wydajne, czysty, prosty kod.

Ten element stylu być traktowane jako rodzaj zbierania strumienia przepływu w rurociągami i mogą być przetwarzane w węźle rurociągu, takich jak filtracja, sortowanie polimeryzacji.

Elementy przepływu w rurociągu przez pośredni operacji (operacja pośrednia) przetwarzanie i ostatecznie uzyskać wyniki wcześniej przetwarzane przez końcowego (operacja terminala).

+--------------------+       +------+   +------+   +---+   +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+       +------+   +------+   +---+   +-------+

Powyższe procesy do kodu Javy:

List<Integer> transactionsIds = 
widgets.stream()
             .filter(b -> b.getColor() == RED)
             .sorted((x,y) -> x.getWeight() - y.getWeight())
             .mapToInt(Widget::getWeight)
             .sum();

Czym jest Stream?

Element kolejce Stream (strumień) jest wsparcie ze źródła danych i operacji zbiorczych

  • Elementy są określone typy obiektów, tworząc kolejkę. W Java Stream nie przechowuje elementy, ale obliczeniowej na żądanie.
  • Źródło Źródło przepływu danych. Można ustawić tablice, I / O, kanał generator i inne generatory.
  • Polimeryzacja jest podobna do instrukcji SQL operacji, takich jak filtr, mapa, zmniejszyć, znaleźć, mecz, posortowanych i tak dalej.

Poprzedni Collection działają różne, operacja Stream istnieją dwie podstawowe funkcje:

  • Montaż rurociągów: operacja pośrednia zwróci sam obiekt strumienia. Tak, że wielokrotne operacje mogą być łączone w jeden rurociąg, styl jako strumień (styl biegle). Ta operacja może zostać zoptymalizowana, takich jak opóźnienia w realizacji (lenistwo) i zwarcia (zwierającego).
  • iteracja wewnętrzna: przed pobraniem przechodzenie przez Iterator lub for-each sposób, wyraźnej zewnętrznej zbiórki iteracyjne, nazywa się to zewnętrzna iteracja. Stream zapewnia wewnętrzną sposób iteracyjny poprzez odwiedzający (Visitor) realizacji.

przepływ generacji

W Javie 8, interfejs zestaw posiada dwie metody do generowania strumienia:

  • Strumień () - tworzy strumień seryjny dla tej kolekcji.

  • parallelStream () - tworzy równoległy strumień do kolekcji.

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

forEach

Stream zapewnia nową metodę "forEach" iterację każdego strumienia danych. Poniższy fragment kodu używa foreach wyjście 10 liczb losowych:

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

mapa

Sposób mapę odwzorowywania każdy element odpowiedni do wyniku, poniższy fragment kodu wykorzystuje wyjście mapy odpowiadającej liczbie elementów kwadratowych:

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
// 获取对应的平方数
List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());

filtr

Metoda filtr jest używany do określenia warunków poprzez odfiltrowanie elementów. Poniższy fragment kodu wykorzystuje filtr metody odfiltrować pusty ciąg:

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
int count = strings.stream().filter(string -> string.isEmpty()).count();

limit

ograniczają sposobu pozyskiwania określoną liczbę strumieni. Poniższy fragment kodu wykorzystuje metodę limitu do wydrukowania danych 10:

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

klasyfikowane

Sposób konwekcji klasyfikowane zamówienia. Poniższy fragment kodu wykorzystuje metody klasyfikowane 10 losowe numery rodzaj wyjścia:

Random random = new Random();
random.ints().limit(10).sorted().forEach(System.out::println);

Równolegle programu (równolegle)

parallelStream jest równoległa substytutem obsługi strumienia. Używamy następujący przykład do wyjścia pusty ciąg liczb parallelStream:

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
int count = strings.parallelStream().filter(string -> string.isEmpty()).count();

Możemy łatwo przełączać w celu uruchomienia równolegle i bezpośredni.


Kolekcjonerzy

Klasa kolektory wykonuje szereg operacji redukcji, na przykład, strumieniem do zbierania i zespołów elementów. Kolektory mogą być wykorzystywane, aby powrócić do listy lub łańcuch:

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

System.out.println("筛选列表: " + filtered);
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("合并字符串: " + mergedString);

statystyka

Ponadto, niektóre tworzą statystyki kolektor również bardzo przydatne. Są one wykorzystywane głównie do podstawowego typu int, podwójne, długie, etc., które mogą być używane do generowania wyników statystycznych podobny do poniższego.

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);

IntSummaryStatistics stats = integers.stream().mapToInt((x) -> x).summaryStatistics();

System.out.println("列表中最大的数 : " + stats.getMax());
System.out.println("列表中最小的数 : " + stats.getMin());
System.out.println("所有数之和 : " + stats.getSum());
System.out.println("平均数 : " + stats.getAverage());

Strumień pełne wystąpienie

Java8Tester.java następujący kod do pliku:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.Map;

public class Java8Tester {
   public static void main(String args[]){
      System.out.println("使用 Java 7: ");
		
      // 计算空字符串
      List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
      System.out.println("列表: " +strings);
      long count = getCountEmptyStringUsingJava7(strings);
		
      System.out.println("空字符数量为: " + count);
      count = getCountLength3UsingJava7(strings);
		
      System.out.println("字符串长度为 3 的数量为: " + count);
		
      // 删除空字符串
      List<String> filtered = deleteEmptyStringsUsingJava7(strings);
      System.out.println("筛选后的列表: " + filtered);
		
      // 删除空字符串,并使用逗号把它们合并起来
      String mergedString = getMergedStringUsingJava7(strings,", ");
      System.out.println("合并字符串: " + mergedString);
      List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
		
      // 获取列表元素平方数
      List<Integer> squaresList = getSquares(numbers);
      System.out.println("平方数列表: " + squaresList);
      List<Integer> integers = Arrays.asList(1,2,13,4,15,6,17,8,19);
		
      System.out.println("列表: " +integers);
      System.out.println("列表中最大的数 : " + getMax(integers));
      System.out.println("列表中最小的数 : " + getMin(integers));
      System.out.println("所有数之和 : " + getSum(integers));
      System.out.println("平均数 : " + getAverage(integers));
      System.out.println("随机数: ");
		
      // 输出10个随机数
      Random random = new Random();
		
      for(int i=0; i < 10; i++){
         System.out.println(random.nextInt());
      }
		
      System.out.println("使用 Java 8: ");
      System.out.println("列表: " +strings);
		
      count = strings.stream().filter(string->string.isEmpty()).count();
      System.out.println("空字符串数量为: " + count);
		
      count = strings.stream().filter(string -> string.length() == 3).count();
      System.out.println("字符串长度为 3 的数量为: " + count);
		
      filtered = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.toList());
      System.out.println("筛选后的列表: " + filtered);
		
      mergedString = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.joining(", "));
      System.out.println("合并字符串: " + mergedString);
		
      squaresList = numbers.stream().map( i ->i*i).distinct().collect(Collectors.toList());
      System.out.println("Squares List: " + squaresList);
      System.out.println("列表: " +integers);
		
      IntSummaryStatistics stats = integers.stream().mapToInt((x) ->x).summaryStatistics();
		
      System.out.println("列表中最大的数 : " + stats.getMax());
      System.out.println("列表中最小的数 : " + stats.getMin());
      System.out.println("所有数之和 : " + stats.getSum());
      System.out.println("平均数 : " + stats.getAverage());
      System.out.println("随机数: ");
		
      random.ints().limit(10).sorted().forEach(System.out::println);
		
      // 并行处理
      count = strings.parallelStream().filter(string -> string.isEmpty()).count();
      System.out.println("空字符串的数量为: " + count);
   }
	
   private static int getCountEmptyStringUsingJava7(List<String> strings){
      int count = 0;
		
      for(String string: strings){
		
         if(string.isEmpty()){
            count++;
         }
      }
      return count;
   }
	
   private static int getCountLength3UsingJava7(List<String> strings){
      int count = 0;
		
      for(String string: strings){
		
         if(string.length() == 3){
            count++;
         }
      }
      return count;
   }
	
   private static List<String> deleteEmptyStringsUsingJava7(List<String> strings){
      List<String> filteredList = new ArrayList<String>();
		
      for(String string: strings){
		
         if(!string.isEmpty()){
             filteredList.add(string);
         }
      }
      return filteredList;
   }
	
   private static String getMergedStringUsingJava7(List<String> strings, String separator){
      StringBuilder stringBuilder = new StringBuilder();
		
      for(String string: strings){
		
         if(!string.isEmpty()){
            stringBuilder.append(string);
            stringBuilder.append(separator);
         }
      }
      String mergedString = stringBuilder.toString();
      return mergedString.substring(0, mergedString.length()-2);
   }
	
   private static List<Integer> getSquares(List<Integer> numbers){
      List<Integer> squaresList = new ArrayList<Integer>();
		
      for(Integer number: numbers){
         Integer square = new Integer(number.intValue() * number.intValue());
			
         if(!squaresList.contains(square)){
            squaresList.add(square);
         }
      }
      return squaresList;
   }
	
   private static int getMax(List<Integer> numbers){
      int max = numbers.get(0);
		
      for(int i=1;i < numbers.size();i++){
		
         Integer number = numbers.get(i);
			
         if(number.intValue() > max){
            max = number.intValue();
         }
      }
      return max;
   }
	
   private static int getMin(List<Integer> numbers){
      int min = numbers.get(0);
		
      for(int i=1;i < numbers.size();i++){
         Integer number = numbers.get(i);
		
         if(number.intValue() < min){
            min = number.intValue();
         }
      }
      return min;
   }
	
   private static int getSum(List numbers){
      int sum = (int)(numbers.get(0));
		
      for(int i=1;i < numbers.size();i++){
         sum += (int)numbers.get(i);
      }
      return sum;
   }
	
   private static int getAverage(List<Integer> numbers){
      return getSum(numbers) / numbers.size();
   }
}

Realizacja powyższego scenariusza, wyjście jest:

$ javac Java8Tester.java 
$ java Java8Tester
使用 Java 7: 
列表: [abc, , bc, efg, abcd, , jkl]
空字符数量为: 2
字符串长度为 3 的数量为: 3
筛选后的列表: [abc, bc, efg, abcd, jkl]
合并字符串: abc, bc, efg, abcd, jkl
平方数列表: [9, 4, 49, 25]
列表: [1, 2, 13, 4, 15, 6, 17, 8, 19]
列表中最大的数 : 19
列表中最小的数 : 1
所有数之和 : 85
平均数 : 9
随机数: 
-393170844
-963842252
447036679
-1043163142
-881079698
221586850
-1101570113
576190039
-1045184578
1647841045
使用 Java 8: 
列表: [abc, , bc, efg, abcd, , jkl]
空字符串数量为: 2
字符串长度为 3 的数量为: 3
筛选后的列表: [abc, bc, efg, abcd, jkl]
合并字符串: abc, bc, efg, abcd, jkl
Squares List: [9, 4, 49, 25]
列表: [1, 2, 13, 4, 15, 6, 17, 8, 19]
列表中最大的数 : 19
列表中最小的数 : 1
所有数之和 : 85
平均数 : 9.444444444444445
随机数: 
-1743813696
-1301974944
-1299484995
-779981186
136544902
555792023
1243315896
1264920849
1472077135
1706423674
空字符串的数量为: 2

Java 8 nowych funkcji Java 8 nowych funkcji