Статьи

Особенности языка Java 8 в двух словах: часть 2

От редакции. Вы также можете проверить часть-1 здесь .

Привет, друзья, это часть 2 из Java 8 Language Features в двух словах.

Здесь мы обсудим следующие особенности Java 8:

  1. Статические методы в интерфейсе
  2. Streams

Логотип Java 8

1. Статические методы в интерфейсе

Что такое статический метод?

Статические методы — это методы, которые принадлежат классу, а не объекту или экземпляру. Другими словами, это означает, что все экземпляры класса имеют одинаковое поведение, определенное в статическом методе. Таким образом, вам не нужно создавать экземпляр или объект класса для вызова статического метода.

Поэтому, если статические методы не нуждаются в вызове объекта, не имеет смысла помещать их в класс, потому что класс является планом для всех объектов, принадлежащих этому классу. Так что, если бы мы могли поместить все статические методы в интерфейс, а не в класс. Хорошая новость в том, что Java 8 это позволяет. С Java 8 мы можем поместить наши служебные методы, которые мы использовали для помещения в класс, теперь в интерфейс.

Синтаксис статического метода в интерфейсе

Синтаксис такой же, как и любой другой статический метод.

1
static <Return Type> <Method Name>();

Основная цель статического метода в интерфейсе

Основная причина, позволяющая добавлять статические методы в интерфейс, состоит в том, чтобы иметь вспомогательные методы в интерфейсе, а не в классе. До Java 8, если бы мы должны были определить некоторые служебные методы, мы создавали класс и определяли служебные методы в этом классе, и поскольку мы знали, что создавать объект класса, имеющего только служебные методы, не имеет смысла, мы делали конструктор этого класса как Private и помечая класс как final, чтобы он не мог наследоваться, потому что мы знаем, что статические методы не наследуются, поэтому лучше пометить его явно, так что, просто взглянув на класс, можно узнать, что это класс не может быть унаследован.

Пример статического метода в интерфейсе

До Java 8

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
final class CustomerUtil {
 
  private CustomerUtil(){
 
  }
  public static Date convertDateFormat(){
 
  }
  public static String appendData() {
 
  }
}
class Test {
 public static void main(String[] args){
  CustomerUtil.convertDateFormat(); 
 }
}

После Java 8

01
02
03
04
05
06
07
08
09
10
11
12
13
interface CustomerUtil {
   public static Date convertDateFormat(){
 
   }
   public static String appendData() {
 
   }
}
class Test {
public static void main(String[] args){
    CustomerUtil.convertDateFormat(); 
 }
}

2. Потоки

Что такое поток в Java 8

Поток — это последовательность элементов из источника, которая поддерживает агрегатные операции. Таким образом, каждый поток будет иметь один источник и один пункт назначения. Данные перемещаются из источника в пункт назначения через поток.

Следующий отрывок из Oracle Documentation очень хорошо описывает разницу между Collection и Stream.

Назначение исходного потока Java 8

  • Нет хранения Поток — это не структура данных, в которой хранятся элементы; вместо этого он передает элементы из источника, такого как структура данных, массив, функция генератора или канал ввода / вывода, через конвейер вычислительных операций.
  • Функциональный характер . Операция над потоком дает результат, но не изменяет его источник. Например, фильтрация Stream полученного из коллекции, создает новый Stream без фильтруемых элементов вместо удаления элементов из исходной коллекции.
  • Поиск лени . Многие потоковые операции, такие как фильтрация, отображение или удаление дубликатов, могут быть реализованы лениво, открывая возможности для оптимизации. Например, «найти первую String с тремя последовательными гласными» не нужно проверять все входные строки. Потоковые операции делятся на промежуточные (создание Stream ) операции и терминальные (создание значения или побочного эффекта) операции. Промежуточные операции всегда ленивы.
  • Возможно, неограничен . Хотя коллекции имеют конечный размер, потоки не нужны. Операции короткого замыкания, такие как limit(n) или findFirst() позволяют выполнять вычисления на бесконечных потоках за конечное время.
  • Расходный . Элементы потока посещаются только один раз в течение жизни потока. Как Iterator , новый поток должен быть сгенерирован, чтобы вернуться к тем же элементам источника

Синтаксис для потока

Поток может быть создан несколькими способами. Мы увидим один из наиболее часто используемых способов и обсудим отдых в другом посте.

Синтаксис Java 8 для потока

Как видно из диаграммы выше, новый интерфейс метода stream() был добавлен в интерфейс Collection, а интерфейсы List, Set, Queue расширяют интерфейс Collection, поэтому все эти интерфейсы, в свою очередь, имеют потоковый метод, который можно использовать для создать поток из этих коллекций в качестве источника.

Синтаксис для создания потока строк со списком в качестве источника

1
2
3
4
List<String> list = new ArrayList<>();
list.add("AA");
 
Stream<String> stream = list.stream();

Синтаксис для создания потока строк с набором в качестве источника

1
2
3
4
Set<String> set = new HashSet<>();
set.add("AA");
 
Stream<String> stream = set.stream();

Основное назначение Stream

Основная цель внедрения Stream API в Java — иметь меньше подробного кода для выполнения операций с группой данных, такой как Collections, Array, и использовать многоядерные процессоры (используя параллельный поток), без необходимости писать одну строку программисту. многопоточности кода, следовательно, улучшение производительности.

Пример операции потока

Скажем, у вас есть список элементов (строк) и вы хотите иметь отдельный список элементов. Далее мы увидим, как вы будете делать это до Java 8 и с Java 8.

До Java 8

01
02
03
04
05
06
07
08
09
10
11
12
13
List<String> list = new ArrayList<>();
list.add("AA");
list.add("BB");
list.add("BB");
list.add("BB");
System.out.println("Size of list before applying distinct logic:"+list.size());
List<String> distinctList1 = new ArrayList<String>();
for(String str : list){
  if(!distinctList1.contains(str)){
    distinctList1.add(str);
  }
}
System.out.println("Distinct List Size:"+ distinctList1.size());

После Java 8

1
2
3
4
5
6
7
8
List<String> sourceList = new ArrayList<>();
sourceList.add("AA");
sourceList.add("BB");
sourceList.add("BB");
sourceList.add("BB");
System.out.println("Size of list before applying Stream Operations:"+sourceList.size());
List<String> distinctList =  sourceList.stream().distinct().collect(Collectors.toList());
System.out.println("Distinct List Size:"+ distinctList.size());

В приведенном выше коде sourceList является источником элементов из Stream distinct() sourceList Stream distinct() и collect() — потоковых операций. DifferentList — это список назначений.

Как видно из приведенного выше примера, в Java 8 код для работы с Collection больше похож на запрос, а не на много стандартного кода. Как и в SQL, нам не нужно писать логику, чтобы найти максимум из коллекции elements.Sql SQL предоставляет для этого функцию max() . Точно так же потоки Java 8 предоставляют множество агрегатных функций, которые мы можем объединить в цепочку, чтобы выполнять несколько операций в одной строке. Преимущество этого подхода состоит в том, что этот код менее многословен, и в нем также используются многоядерные процессоры, что также повышает производительность.

Рекомендации :

https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html

http://www.oracle.com/technetwork/articles/java/ma14-java-se-8-streams-2177646.html

Опубликовано на Java Code Geeks с разрешения Гаурава Бхардваджа, партнера нашей программы JCG . Смотрите оригинальную статью здесь: Особенности языка Java 8 в двух словах — часть 2

Мнения, высказанные участниками Java Code Geeks, являются их собственными.