Java >> Tutorial de Java >  >> Java

Tutorial de coleccionistas de Java 8

El tutorial de Java 8 Collectors consta principalmente de tres cosas:Stream.collect() método, Coleccionista interfaz y Coleccionistas clase. recoger() El método es una operación de terminal en Stream interfaz. Coleccionista es una interfaz en java.util.stream paquete. Coleccionistas clase, también miembro de java.util.stream paquete, es una clase de utilidad que contiene muchos métodos estáticos que realizan algunas operaciones de reducción comunes. Discutámoslos uno por uno.

1) Stream.collect() Método

recoger() El método es una operación de terminal en Stream interfaz. Es un caso especial de operación de reducción llamada operación de reducción mutable porque devuelve un contenedor de resultados mutable como List , Establecer o Mapa según el Colector suministrado .

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class CollectorsExamples 
{
	public static void main(String[] args) 
	{
		List<Integer> numbers = Arrays.asList(8, 2, 5, 7, 3, 6);
		
		//collect() method returning List of OddNumbers
		
		List<Integer> oddNumbers = numbers.stream().filter(i -> i%2 != 0).collect(Collectors.toList());
		
		System.out.println(oddNumbers);
		
		//OUTPUT : [5, 7, 3]
	}
}

2) java.util.stream.Collector Interfaz

java.util.stream.Collector La interfaz contiene cuatro funciones que trabajan juntas para acumular elementos de entrada en un contenedor de resultados mutable y, opcionalmente, realiza una transformación final en el resultado. Esas cuatro funciones son,

a) Proveedor() :

Una función que crea y devuelve un nuevo contenedor de resultados mutables.

b) acumulador() :

Una función que acumula un valor en un contenedor de resultados mutable.

c) combinador() :

Una función que acepta dos resultados parciales y los fusiona.

d) finalizador() :

Una función que realiza la transformación final del tipo de acumulación intermedia al tipo de resultado final.

3) java.util.stream.Collectors Clase

java.util.stream.Collectors La clase contiene métodos de fábrica estáticos que realizan algunas operaciones de reducción comunes, como acumular elementos en la colección, encontrar el mínimo, el máximo, el promedio, la suma de elementos, etc. Todos los métodos de Collectors retorno de clase Coleccionista tipo que se proporcionará a collect() método como argumento.

Veamos Coleccionistas métodos de clase uno por uno.

En los siguientes ejemplos de codificación, usaremos el siguiente Estudiante clase y lista de estudiantes .

Estudiante Clase:

class Student
{
	String name;
	
	int id;
	
	String subject;
	
	double percentage;
	
	public Student(String name, int id, String subject, double percentage) 
	{
		this.name = name;
		this.id = id;
		this.subject = subject;
		this.percentage = percentage;
	}
	
	public String getName() 
	{
		return name;
	}
	
	public int getId() 
	{
		return id;
	}
	
	public String getSubject() 
	{
		return subject;
	}
	
	public double getPercentage() 
	{
		return percentage;
	}
	
	@Override
	public String toString() 
	{
		return name+"-"+id+"-"+subject+"-"+percentage;
	}
}

lista de estudiantes :

List<Student> studentList = new ArrayList<Student>();
		
studentList.add(new Student("Paul", 11, "Economics", 78.9));
studentList.add(new Student("Zevin", 12, "Computer Science", 91.2));
studentList.add(new Student("Harish", 13, "History", 83.7));
studentList.add(new Student("Xiano", 14, "Literature", 71.5));
studentList.add(new Student("Soumya", 15, "Economics", 77.5));
studentList.add(new Student("Asif", 16, "Mathematics", 89.4));
studentList.add(new Student("Nihira", 17, "Computer Science", 84.6));
studentList.add(new Student("Mitshu", 18, "History", 73.5));
studentList.add(new Student("Vijay", 19, "Mathematics", 92.8));
studentList.add(new Student("Harry", 20, "History", 71.9));
3.1) Coleccionistas.toList() :

Devuelve un Coleccionista que recopila todos los elementos de entrada en una nueva Lista .

Ejemplo:recopilación de los 3 mejores estudiantes en Lista

List<Student> top3Students = studentList.stream().sorted(Comparator.comparingDouble(Student::getPercentage).reversed()).limit(3).collect(Collectors.toList());
		
System.out.println(top3Students);
		
//Output :
		
//[Vijay-19-Mathematics-92.8, Zevin-12-Computer Science-91.2, Asif-16-Mathematics-89.4]
3.2) Coleccionistas.toSet() :

Devuelve un Coleccionista que recopila todos los elementos de entrada en un nuevo Conjunto .

Ejemplo:recopilación de temas ofrecidos en Set .

Set<String> subjects = studentList.stream().map(Student::getSubject).collect(Collectors.toSet());
		
System.out.println(subjects);
		
//Output :
		
//[Economics, Literature, Computer Science, Mathematics, History]
3.3) Coleccionistas.toMap() :

Este método devuelve un Collector que recopila elementos de entrada en un mapa cuyas claves y valores son el resultado de aplicar funciones de mapeo a elementos de entrada.

Ejemplo:recopilar el nombre y el porcentaje de cada alumno en un mapa

Map<String, Double> namePercentageMap = studentList.stream().collect(Collectors.toMap(Student::getName, Student::getPercentage));
		
System.out.println(namePercentageMap);
		
//Output :
		
//{Asif=89.4, Vijay=92.8, Zevin=91.2, Harry=71.9, Xiano=71.5, Nihira=84.6, Soumya=77.5, Mitshu=73.5, Harish=83.7, Paul=78.9}
3.4) Coleccionistas.aColección() :

Este método devuelve un Collector que recopila todos los elementos de entrada en una nueva Colección .

Ejemplo:recopilar los primeros 3 estudiantes en LinkedList

LinkedList<Student> studentLinkedList = studentList.stream().limit(3).collect(Collectors.toCollection(LinkedList::new));
		
System.out.println(studentLinkedList);
		
//Output :
		
//[Paul-11-Economics-78.9, Zevin-12-Computer Science-91.2, Harish-13-History-83.7]
3.5) Coleccionistas.joining() :

Este método devuelve un Collector que concatena elementos de entrada separados por el delimitador especificado.

Ejemplo:recopilar los nombres de todos los estudiantes unidos como una cadena

String namesJoined = studentList.stream().map(Student::getName).collect(Collectors.joining(", "));
		
System.out.println(namesJoined);
		
//Output :
		
//Paul, Zevin, Harish, Xiano, Soumya, Asif, Nihira, Mitshu, Vijay, Harry
3.6) Coleccionistas.contando() :

Devuelve un Coleccionista que cuenta el número de elementos de entrada.

Ejemplo:contar el número de estudiantes.

Long studentCount = studentList.stream().collect(Collectors.counting());
		
System.out.println(studentCount);
		
//Output : 10
3.7) Coleccionistas.maxBy() :

Este método devuelve un Collector que recopila el elemento más grande en una secuencia según el Comparador suministrado .

Ejemplo:Recolectando el porcentaje más alto.

Optional<Double> highPercentage = studentList.stream().map(Student::getPercentage).collect(Collectors.maxBy(Comparator.naturalOrder()));
		
System.out.println(highPercentage);
		
//Output : Optional[92.8]
3.8) Coleccionistas.minBy() :

Este método devuelve un Collector que recopila el elemento más pequeño en una secuencia de acuerdo con el Comparador proporcionado .

Ejemplo:Recopilación del porcentaje más bajo.

Optional<Double> lowPercentage = studentList.stream().map(Student::getPercentage).collect(Collectors.minBy(Comparator.naturalOrder()));
		
System.out.println(lowPercentage);
		
//Output : Optional[71.5]
3.9) sumandoEntero(), sumandoLargo(), sumandoDoble()

Estos métodos devuelven un Collector que recopila la suma de todos los elementos de entrada.

Ejemplo:Recopilación de sumas de porcentajes

Double sumOfPercentages = studentList.stream().collect(Collectors.summingDouble(Student::getPercentage));
		
System.out.println(sumOfPercentages);
		
//Output : 815.0
3.10) promediarInt(), promediarLargo(), promediarDoble()

Estos métodos devuelven un Collector que recopila el promedio de los elementos de entrada.

Ejemplo:Recopilación de porcentaje promedio

Double averagePercentage = studentList.stream().collect(Collectors.averagingDouble(Student::getPercentage));
		
System.out.println(averagePercentage);
		
//Output : 81.5
3.11) resumirInt() , resumiendoLargo() , resumiendoDoble()

Estos métodos devuelven una clase especial llamada Int/Long/ DoubleSummaryStatistics que contienen información estadística como suma, máximo, mínimo, promedio, etc. de elementos de entrada.

Ejemplo:extraer el porcentaje más alto, más bajo y promedio de estudiantes

DoubleSummaryStatistics studentStats = studentList.stream().collect(Collectors.summarizingDouble(Student::getPercentage));
		
System.out.println("Highest Percentage : "+studentStats.getMax());
		
System.out.println("Lowest Percentage : "+studentStats.getMin());
		
System.out.println("Average Percentage : "+studentStats.getAverage());
		
//Output :
		
//Highest Percentage : 92.8
//Lowest Percentage : 71.5
//Average Percentage : 81.5
3.12) Coleccionistas.groupingBy() :

Este método agrupa los elementos de entrada según el clasificador proporcionado y devuelve los resultados en un Mapa .

Ejemplo:agrupar a los estudiantes por materia

Map<String, List<Student>> studentsGroupedBySubject = studentList.stream().collect(Collectors.groupingBy(Student::getSubject));
		
System.out.println(studentsGroupedBySubject);
		
//Output :
		
//{Economics=[Paul-11-Economics-78.9, Soumya-15-Economics-77.5], 
// Literature=[Xiano-14-Literature-71.5], 
// Computer Science=[Zevin-12-Computer Science-91.2, Nihira-17-Computer Science-84.6], 
// Mathematics=[Asif-16-Mathematics-89.4, Vijay-19-Mathematics-92.8], 
// History=[Harish-13-History-83.7, Mitshu-18-History-73.5, Harry-20-History-71.9]}
3.13) Coleccionistas.particionamiento por() :

Este método divide los elementos de entrada según el Predicado suministrado. y devuelve un Map> . Bajo el verdadero clave, encontrará elementos que coincidan con el Predicado dado y bajo el falso key, encontrará los elementos que no coinciden dado Predicate .

Ejemplo:Dividir los estudiantes que superaron el 80,0 % de los que no.

Map<Boolean, List<Student>> studentspartionedByPercentage = studentList.stream().collect(Collectors.partitioningBy(student -> student.getPercentage() > 80.0));
		
System.out.println(studentspartionedByPercentage);
		
//Output :
		
// {false=[Paul-11-Economics-78.9, Xiano-14-Literature-71.5, Soumya-15-Economics-77.5, Mitshu-18-History-73.5, Harry-20-History-71.9], 
//  true=[Zevin-12-Computer Science-91.2, Harish-13-History-83.7, Asif-16-Mathematics-89.4, Nihira-17-Computer Science-84.6, Vijay-19-Mathematics-92.8]}
3.14) Coleccionistas.coleccionandoYLuego() :

Este es un método especial que le permite realizar una acción más en el resultado después de recopilarlo.

Ejemplo:recopilar los primeros tres estudiantes en List y hacerlo inmodificable

List<Student> first3Students = studentList.stream().limit(3).collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList));
		
System.out.println(first3Students);
		
//Output :
		
//[Paul-11-Economics-78.9, Zevin-12-Computer Science-91.2, Harish-13-History-83.7]

Tutoriales relacionados con Java 8:

  • Expresiones Lambda de Java 8
  • Interfaces funcionales de Java 8
  • Referencias de métodos de Java 8
  • Cambios en la interfaz de Java 8
  • Guía de corrientes de Java 8
  • Clase de coleccionistas Oracle Doc

Etiqueta Java