Similar presentations:
Новые фичи Java
1.
Новые фичи JavaCroc 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 и MapC java 9 для List и Set:
List immutableList = List.
();
// пустой неизменяемый список
List immutableList = List.
содержащий информацию
("one","two","three");
// неизменяемый список,
5.
Immutable List, Set и MapC 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.
Switchint 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.
Switchint 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.
Switchvar 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.
Switchvar 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.
Recordsfinal 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.
Recordspublic
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.
Подсказки при NullPointerExceptionpublic 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 classespublic
class Parent
ChildA, ChildB, ChildC { ... }
39.
Sealed classesinterface 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.
Singletonclass Singleton {
private static Singleton instance = null;
{}
public static Singleton getInstance() {
if (
) {
instance = new Singleton();
}
return instance;
}
}
47.
FactoryИспользуется, когда у нас есть суперкласс с несколькими подклассами и на
основе ввода, нам нужно вернуть один из подкласса. Класс не знает какого
типа объект он должен создать. Объекты создаются в зависимости от входящих
данных.
48.
Factoryinterface 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.
Factoryclass 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.
Factorypublic static void main(String[] args){
String win = "linux";
factory = new Factory();
os = factory.getCurrentOS(win);
os.getOS();
}
51.
Abstract FactoryПозволяет выбрать конкретную реализацию фабрики из семейства возможных
фабрик. Создает семейство связанных объектов. Легко расширять.
52.
Abstract Factoryinterface
{
Ferrari getFerrari();
}
interface Ferrari {
long getFerrariPrice();
}
53.
Abstract Factoryclass UsCarFactory implements CarFactory {
public Ferrari getFerrari() {
return new
();
}
}
class RuCarFactory implements CarFactory {
public Ferrari getFerrari() {
return new
();
}
}
54.
Abstract Factoryclass RuFerrariImpl implements Ferrari {
public long getFerrariPrice() {
return 30000;
}
}
class UsFerrariImpl implements Ferrari {
public long getFerrariPrice() {
return 3000;
}
}
55.
Abstract Factorypublic 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.
Prototypeinterface 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.
Prototypepublic static void main(String[] args) {
ComplicatedObject prototype = new ComplicatedObject();
ComplicatedObject clone = prototype.copy();
clone.setType(ComplicatedObject.Type.ONE);
}
59.
Структурные60.
AdapterИспользуя паттерн, мы можем объединить два несовместимых объекта. Конвертер
между двумя несовместимыми объектами.
61.
Adapterpublic interface USB {
void connectWithUsbCable();
}
public class MemoryCard {
public void insert() {
System.out.println("Карта памяти успешно вставлена!");
}
public void copyData() {
System.out.println("Данные скопированы на компьютер!");
}
}
62.
Adapterpublic class CardReader implements
private
{
memoryCard;
public CardReader(MemoryCard memoryCard) {
this.memoryCard = memoryCard;
}
@Override
public void connectWithUsbCable() {
this.memoryCard.insert();
this.memoryCard.copyData();
}
}
63.
Adapterpublic static void main(String[] args) {
USB cardReader = new CardReader(new MemoryCard());
cardReader.connectWithUsbCable();
}
64.
ProxyПредставляет объекты, которые могут контролировать другие объекты
перехватывая их вызовы. Можно перехватить вызов оригинального объекта
65.
Proxyinterface
{
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.
Proxyclass 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.
Proxypublic static void main(String[] args) {
Image image = new ProxyImage("test.jpg");
image.display();
image.display();
}
68.
FacadeСкрывает сложную систему классов приводя все вызовы к одному объекту.
Помещает вызов нескольких сложных объектов в один объект.
69.
Facadeclass 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.
Facadeclass 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.
Facadepublic static void main(String[] args) {
Car car = new Car();
car.startCar();
car.stopCar();
}
72.
Поведенческие73.
StrategyОпределяет ряд алгоритмов позволяя взаимодействовать между ними. Алгоритм
стратегии может быть изменен во время выполнения программы
74.
Strategyinterface 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.
Strategyclass 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.
Commandinterface Command {
void execute();
}
class Car {
public void startEngine() {
System.out.println("запустить двигатель");
}
public void stopEngine() {
System.out.println("остановить двигатель");
}
}
78.
Commandclass 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.
Commandclass 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 Methodabstract class Car {
abstract void startEngine();
abstract void stopEngine();
public final void start(){
startEngine();
stopEngine();
}
}
81.
Template Methodclass 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 Methodpublic static void main(String[] args) {
Car car1 = new OneCar();
car1.start();
Car car2 = new TwoCar();
car2.start();
}