1.10M
Category: programmingprogramming

Новые фичи Java

1.

Новые фичи Java
Croc Java School

2.

Java 9 (сентябрь 2017)

3.

Immutable List, Set и Map
До java 9:
Collections.unmodifiableXXX
{
List<String> immutableList = Collections.unmodifiableList("Java");
}

4.

Immutable List, Set и Map
C java 9 для List и Set:
List immutableList = List.
();
// пустой неизменяемый список
List immutableList = List.
содержащий информацию
("one","two","three");
// неизменяемый список,

5.

Immutable List, Set и Map
C java 9 для Map:
Map emptyImmutableMap = Map. ()
emptyImmutableMap ==> {} // пустое неизменяемое отображение
Map nonemptyImmutableMap = Map. (1, "one", 2, "two", 3, "three")
nonemptyImmutableMap ==> {2=two, 3=three, 1=one} // неизменяемое
отображение
Map<String, String> mapOfEntries = Map.
entry("Key1", "Value1"),
entry("Key2", "Value2")
);
(

6.

Private методы в интерфейсах
public interface Card
{
Long createCardID()
{
// Реализация метода происходит здесь.
}
static void displayCardDetails()
{
// Реализация метода происходит здесь.
}
}

7.

Изменения в try-with-resources
До java 9:
{
BufferedReader reader1 =
new BufferedReader(new FileReader("input.txt"));
try (BufferedReader reader2 = reader1) {
System.out.println(reader2.readLine());
}
}

8.

Изменения в try-with-resources
С java 9:
{
BufferedReader reader1 =
new BufferedReader(new FileReader("input.txt"));
try (reader1) {
System.out.println(reader1.readLine());
}
}

9.

Java 10 (март 2018)

10.

var
{
message = ”Java";
System.out.println(message);
}

11.

var
{
int intNumber = 20; // this is of type int
long longNumber = 20; // this is of type long
float floatNumber = 20; // this is of type float, 20.0
double doubleNumber = 20; // this is of type double, 20.0
}

12.

var
{
var intNumber = 20; // this is inferred as int
var longNumber = 20; // this is inferred as int
var floatNumber = 20; // this is inferred as int
var doubleNumber = 20; // this is inferred as int
}

13.

var
{
var intNumber = 20;
var longNumber = 20L;
var floatNumber = 20F;
var doubleNumber = 20D;
}
// this is inferred as int
// this is inferred as long
// this is inferred as float, 20.0
// this is inferred as double, 20.0

14.

Java 11 (сентябрь 2018)

15.

var (в лямбде)
Function<String, String> append = (
str) -> str + " Text";
String appendedString = append.apply("Some");
System.out.println(appendedString);

16.

var (в лямбде)
Function<String, String> append =
str) -> str + " Text";

17.

Другие нововведения:
ByteArrayOutputStream получил метод void writeBytes(byte []),
записывающий все байты из аргумента в OutputStream.
FileReader и FileWriter получили новые конструкторы, позволяющие
указывать Charset.
Path отхватил два новых метода, of(String, String []) возвращает Path из
строкового аргумента пути или последовательности строк, которые при
объединении образуют строку пути и of(URI): возвращает Path из URI.
Pattern — получил метод asMatchPredicate(), который проверяет,
соответствует ли заданная строка ввода, заданному шаблону (позволяет ли
создать предикат по регулярному выражению, чтобы можно было, например,
фильтровать данные в stream).

18.

Другие нововведения:
String отхватил много полезных методов, таких как:
● String strip(): вернёт нам строку, которая является этой строкой, при
этом удаляются все пробелы в начале и в конце строки (аналог trim(), но
по-другому определяет пробелы);
● String stripLeading(): вернёт нам строку, которая является этой строкой,
при этом удаляются все пробелы в начале строки;
● String stripTrailing(): вернёт нам строку, которая является этой строкой,
при этом удаляются все пробелы в конце строки;
● Stream lines(): вернёт нам Stream из String, извлеченных из этой строки,
поделенных разделителями строк("\n", "\r", "\r\n");
● String repeat(int): вернёт нам строку, которая представляет собой
конкатенацию этой строки, повторяющееся количество раз.
● boolean isBlank(): вернёт нам true, если строка пуста или содержит только
пробелы, иначе false.

19.

Другие нововведения:
● Thread — были удалены методы destroy() и stop(Throwable).
Files получил ряд новых методов:
● String readString(Path): читает все данные из файла в строку, при этом
декодируя из байт в символы с использованием кодировки UTF-8;
● String readString(Path, Charset): так же, как и в методе выше, с разницей
в том, что декодирование из байт в символы происходит с использованием
указанной Charset;
● Path writeString (Path, CharSequence, OpenOption []): записывает
последовательность символов в файл. Символы кодируются в байты, используя
кодировку UTF-8;
● Path writeString(Path, CharSequence,Charset, OpenOption []): такой же
метод, что и выше, только символы кодируются в байты, используя
кодировку, указанную в Charset.

20.

Java 12 (март 2019)

21.

Switch
int numLetters;
switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
numLetters = 6;
break;
case TUESDAY:
numLetters = 7;
break;
case THURSDAY:
case SATURDAY:
numLetters = 8;
break;
case WEDNESDAY:
numLetters = 9;
break;
default:
throw new IllegalStateException("Huh? " + day);
}

22.

Switch
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
default -> throw new IllegalStateException("Huh? " + day);
};

23.

Switch
var result = switch (someDay) {
case "M", "W", "F" -> "MWF";
case "T", "TH", "S" -> "TTS";
default -> {
if(someDay.isEmpty())
"Please insert a valid day.";
else
"Looks like a Sunday.";
}
};

24.

Другие нововведения:
● String:
transform(Function f) — применяет предоставленную функцию к строке.
Результат может не быть строкой.
indent(int x) — добавляет x пробелов в строку. Если параметр отрицателен,
то это количество начальных пробелов будет удалено(если это возможно).
● Files — отхватил такой метод как mismatch(), который, в свою очередь,
находит и возвращает позицию первого несовпадающего байта в содержимом
двух файлов или -1L, если нет несоответствия.
● InputStream получил метод — skipNBytes(long n): пропустить n-ое количество
байтов из входного потока.

25.

Java 13 (сентябрь 2019)

26.

Switch
var result = switch (someDay) {
case "M", "W", "F" -> "MWF";
case "T", "TH", "S" -> "TTS";
default -> {
if(someDay.isEmpty())
"Please insert a valid day.";
else
"Looks like a Sunday.";
}
};

27.

Текстовые блоки
String block =
Multi-line text
with indentation
and "double quotes"!
;

28.

Текстовые блоки
String smallBlock = """Only one line""";
//java: illegal text block open delimiter sequence, missing line terminator

29.

Java 14 (март 2020) - Java 17
(сентябрь 2021)

30.

Records
final class Triangle {
public final int x;
public final int y;
public final int z;
public Triangle(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
// equals, hashCode, toString

31.

Records
public
Triangle(
){}

32.

Pattern Matching для instanceof
До Java 14:
Object object = Violin;
if (object instanceof Instrument) {
Instrument instrument = (Instrument) object;
System.out.println(instrument.getMaster());
}

33.

Pattern Matching для instanceof
С Java 14:
Object object = Violin;
if (object instanceof
){
System.out.println(instrument.getMaster());
}

34.

Pattern Matching для instanceof
С Java 14:
Object o = "Java";
if (!(o instanceof
)) {
throw new RuntimeException("expecting string");
}
// s is in scope here!
System.out.println( .toUpperCase());

35.

Подсказки при NullPointerException
public class Planet {
private List<Country> countries;
//...
}
public class Country {
private List<City> cities;
//...
}
public class City {
private String name;
//...
}

36.

Подсказки при NullPointerException
До Java 14:
planet.getCountries().forEach(c -> c.getCities().forEach(city -> city.hashCode()));
Exception in thread "main" java.lang.NullPointerException at
ru.xpendence.jep_358_nullpointerexception.Main.main(Main.java:19)

37.

Подсказки при NullPointerException
С Java 14:
planet.getCountries().forEach(c -> c.getCities().forEach(city -> city.hashCode()));
Exception in thread "main" java.lang.NullPointerException: Cannot assign field "cities" because
at Main.main(Main.java:19) ...

38.

Sealed classes
public
class Parent
ChildA, ChildB, ChildC { ... }

39.

Sealed classes
interface Parent
ChildA, ChildB, ChildC { ... }

40.

Sealed classes
список может быть опущена, если подклассы (или интерфейсы)
расположены в том же файле:
public sealed class Parent {
final class Child1 extends Parent {}
final class Child2 extends Parent {}
final class Child3 extends Parent {}
}

41.

Sealed classes
Каждый подкласс или интерфейс в permits списке должен использовать только
один из следующих модификаторов:
final (запрещает дальнейшее наследование; только для подклассов,
поскольку интерфейсы не могут быть final)
sealed (допускает дальнейшее, ограниченное наследование)
non-sealed (снова разрешает неограниченное наследование)

42.

Паттерны проектирования

43.

Типы паттернов
● Порождающие - паттерны предоставляют механизмы инициализации, позволяя
создавать объекты удобным способом
● Структурные - паттерны определяют отношения между классами и объектами,
позволяя им работать совместно
● Поведенческие - паттерны используются для того, чтобы упростить
взаимодействие между сущностями

44.

Порождающие

45.

Singleton
Ограничивает создание одного экземпляра класса, обеспечивает доступ к его
единственному объекту. Конструктор класса приватный

46.

Singleton
class Singleton {
private static Singleton instance = null;
{}
public static Singleton getInstance() {
if (
) {
instance = new Singleton();
}
return instance;
}
}

47.

Factory
Используется, когда у нас есть суперкласс с несколькими подклассами и на
основе ввода, нам нужно вернуть один из подкласса. Класс не знает какого
типа объект он должен создать. Объекты создаются в зависимости от входящих
данных.

48.

Factory
interface OS {
void getOS();
}
class windowsOS implements OS {
public void getOS () {
System.out.println("Текущая система: windows");
}
}
class linuxOS implements OS {
public void getOS () {
System.out.println("Текущая система: linux");
}
}
class macOS implements OS {
public void getOS () {
System.out.println("Текущая система: mac");
}
}

49.

Factory
class Factory {
public OS getCurrentOS(String inputos) {
OS os = null;
if (inputos.equals("windows")) {
os = new windowsOS();
} else if (inputos.equals("linux")) {
os = new linuxOS();
} else if (inputos.equals("mac")) {
os = new macOS();
}
return os;
}
}

50.

Factory
public static void main(String[] args){
String win = "linux";
factory = new Factory();
os = factory.getCurrentOS(win);
os.getOS();
}

51.

Abstract Factory
Позволяет выбрать конкретную реализацию фабрики из семейства возможных
фабрик. Создает семейство связанных объектов. Легко расширять.

52.

Abstract Factory
interface
{
Ferrari getFerrari();
}
interface Ferrari {
long getFerrariPrice();
}

53.

Abstract Factory
class UsCarFactory implements CarFactory {
public Ferrari getFerrari() {
return new
();
}
}
class RuCarFactory implements CarFactory {
public Ferrari getFerrari() {
return new
();
}
}

54.

Abstract Factory
class RuFerrariImpl implements Ferrari {
public long getFerrariPrice() {
return 30000;
}
}
class UsFerrariImpl implements Ferrari {
public long getFerrariPrice() {
return 3000;
}
}

55.

Abstract Factory
public static void main(String[] args) {
String country = "US";
CarFactory factory = null;
if(country.equals("US")) {
factory = new
();
} else if(country.equals("RU")) {
factory = new
();
}
Ferrari ferrari = factory.getFerrari();
System.out.println(ferrari.getFerrariPrice());
}

56.

Prototype
Помогает создать дублированный объект с лучшей производительностью, вместо
нового создается возвращаемый клон существующего объекта. Клонирует
существующий объект.

57.

Prototype
interface Copyable {
Copyable
();
}
class ComplicatedObject implements Copyable {
private Type type;
public enum Type {
ONE, TWO
}
public ComplicatedObject
() {
return new ComplicatedObject();
}
public void setType(Type type) {
this.type = type;
}
}

58.

Prototype
public static void main(String[] args) {
ComplicatedObject prototype = new ComplicatedObject();
ComplicatedObject clone = prototype.copy();
clone.setType(ComplicatedObject.Type.ONE);
}

59.

Структурные

60.

Adapter
Используя паттерн, мы можем объединить два несовместимых объекта. Конвертер
между двумя несовместимыми объектами.

61.

Adapter
public interface USB {
void connectWithUsbCable();
}
public class MemoryCard {
public void insert() {
System.out.println("Карта памяти успешно вставлена!");
}
public void copyData() {
System.out.println("Данные скопированы на компьютер!");
}
}

62.

Adapter
public class CardReader implements
private
{
memoryCard;
public CardReader(MemoryCard memoryCard) {
this.memoryCard = memoryCard;
}
@Override
public void connectWithUsbCable() {
this.memoryCard.insert();
this.memoryCard.copyData();
}
}

63.

Adapter
public static void main(String[] args) {
USB cardReader = new CardReader(new MemoryCard());
cardReader.connectWithUsbCable();
}

64.

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

65.

Proxy
interface
{
void display();
}
class RealImage implements Image {
private String file;
public RealImage(String file){
this.file = file;
load(file);
}
private void load(String file){
System.out.println("Загрузка " + file);
}
public void
() {
System.out.println("Просмотр " + file);
}
}

66.

Proxy
class ProxyImage implements Image {
private String file;
private
image;
public ProxyImage(String file){
this.file = file;
}
public void display() {
if(image == null){
image =
(file);
}
image.display();
}
}

67.

Proxy
public static void main(String[] args) {
Image image = new ProxyImage("test.jpg");
image.display();
image.display();
}

68.

Facade
Скрывает сложную систему классов приводя все вызовы к одному объекту.
Помещает вызов нескольких сложных объектов в один объект.

69.

Facade
class Key {
public void insert() {
System.out.println("Вставить ключи");
}
public void pull() {
System.out.println("Вытянуть ключи");
}
}
class Engine {
public void start() {
System.out.println("Запустить двигатель");
}
public void stop() {
System.out.println("Остановить двигатель");
}
}

70.

Facade
class Car {
private Key key;
private Engine engine;
public Car() {
key = new Key();
engine = new Engine();
}
public void startCar() {
key.insert();
engine.start();
}
public void stopCar() {
engine.stop();
key.pull();
}
}

71.

Facade
public static void main(String[] args) {
Car car = new Car();
car.startCar();
car.stopCar();
}

72.

Поведенческие

73.

Strategy
Определяет ряд алгоритмов позволяя взаимодействовать между ними. Алгоритм
стратегии может быть изменен во время выполнения программы

74.

Strategy
interface Strategy {
void download(String file);
}
class DownloadWindownsStrategy implements Strategy {
public void download(String file) {
System.out.println("windows download: " + file);
}
}
class DownloadLinuxStrategy implements Strategy {
public void download(String file) {
System.out.println("linux download: " + file);
}
}

75.

Strategy
class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public void download(String file){
strategy.download(file);
}
}
public static void main(String[] args) {
Context context = new Context(new
context.download("file.txt");
context = new Context(new
context.download("file.txt");
}
());
());

76.

Command
Позволяет инкапсулировать различные операции в отдельные объекты

77.

Command
interface Command {
void execute();
}
class Car {
public void startEngine() {
System.out.println("запустить двигатель");
}
public void stopEngine() {
System.out.println("остановить двигатель");
}
}

78.

Command
class StartCar implements Command {
Car car;
public StartCar(Car car) {
this.car = car;
}
public void execute() {
car.startEngine();
}
}
class StopCar implements Command {
Car car;
public StopCar(Car car) {
this.car = car;
}
public void execute() {
car.stopEngine();
}
}

79.

Command
class CarInvoker {
public Command command;
public CarInvoker(Command command){
this.command = command;
}
public void execute(){
this.command.execute();
}
}
public static void main(String[] args) {
Car car = new Car();
StartCar startCar = new StartCar(car);
StopCar stopCar = new StopCar(car);
CarInvoker carInvoker = new CarInvoker(startCar);
carInvoker.execute();
}

80.

Template Method
abstract class Car {
abstract void startEngine();
abstract void stopEngine();
public final void start(){
startEngine();
stopEngine();
}
}

81.

Template Method
class OneCar extends Car {
public void startEngine() {
System.out.println("Start engine.");
}
public void stopEngine() {
System.out.println("Stop engine.");
}
}
class TwoCar extends Car {
public void startEngine() {
System.out.println("Start engine.");
}
public void stopEngine() {
System.out.println("Stop engine.");
}
}

82.

Template Method
public static void main(String[] args) {
Car car1 = new OneCar();
car1.start();
Car car2 = new TwoCar();
car2.start();
}
English     Русский Rules