код Kotlin & Java

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

код Kotlin & Java

Непрочитанное сообщение Olej » 27 май 2017, 19:50

Про новый (2011г.) язык программирования Kotlin здесь уже говорилось в теме Kotlin.
Но там разговор об инструментарии Kotlin: где взять? как установить? проверить работоспособность? что там с версиями?

Но Kotlin во многом обсуждают как абсолютно прозрачную замену Java. Обсуждают даже такие варианты как: переписать код достаточно крупного Java-проекта, уже достаточно долго находящийся в развитии - переписать его на Kotlin.

Поэтому тема здесь будет о коде Kotlin.
И его соотношении и сосуществовании с библиотеками (.jar & .class) на традиционной Java.
Тут ещё хороший и нужный вопрос: почему, в каких областях, и из каких соображений Java, которая развивается с 1990г. и версия 1.0 начала 1996г. должна уступить место Kotlin?

P.S. Я не уверен, что смогу (буду иметь время и желание) писать сюда в тему примеры кода Kotlin в самые ближайшие дни, но а). тема такую следует застолбить + б). возможно кому-то захочется попробовать Kotlin раньше ... тем более, что по ссылке выше всё, что нужно для начала работы с Kotlin, уже описано.

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: код Kotlin & Java

Непрочитанное сообщение Olej » 27 май 2017, 23:19

Что такое Kotlin и с чем его едят: обучающее руководство и сравнение нового языка Android-разработки с Java
Изображение
Kotlin — это относительно молодой язык от российской компании JetBrains. Появился он в 2011 году. На конференции Google I/O 2017 команда разработчиков Android сообщила, что Kotlin стал официальным языком операционной системы.
в IntelliJ доступна автоматическая конвертация Java-кода в Kotlin и наоборот;
Заметим, что IntelliJ - это IDE именно от компании JetBrains, очень удачная, но единственная значимая разработка этой компании ...
Будущее Kotlin
Kotlin — это следующий этап развития Java, с которой он полностью совместим. Это делает его отличным инструментом для мобильных и энтерпрайз-приложений. А поскольку Kotlin теперь является официальным языком Android, можно не бояться, что, изучив его, вы останетесь без работы. Помочь в изучении этого языка вам сможет серия статей, описывающая процесс создания простого мобильного приложения
А вот список статей:
  1. Настройка Android Studio.
  2. MainActivity.kt: синтаксис, null-безопасность и другое.
  3. NewsFragment.kt: функции-расширения, Android-расширения и т.д.
  4. RecyclerView : классы данных и адаптеры делегатов.
  5. Kotlin, RxJava и RxAndroid.
  6. API :  Retrofit и Kotlin.
  7. Бесконечная прокрутка: функции высшего порядка и лямбды.
  8. Изменение ориентации экрана.
  9. Юнит-тестирование: Mockito, RxJava и Spek.

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: код Kotlin & Java

Непрочитанное сообщение Olej » 29 май 2017, 15:53

Olej писал(а): Поэтому тема здесь будет о коде Kotlin.
И его соотношении и сосуществовании с библиотеками (.jar & .class) на традиционной Java.
Тут ещё хороший и нужный вопрос: почему, в каких областях, и из каких соображений Java, которая развивается с 1990г. и версия 1.0 начала 1996г. должна уступить место Kotlin?
Возьму готовое приложение на Java, которое я когда-то выписал на 15-ти разных языках программирования для сравнения, в том числе и Java.
Вот попытка его прописания на Kotlin и будет:
- попыткой прописать туже задачу на 16-м языке программирования ...
- сравнением кода Java с кодом Kotlin
- автоматически трансформировать Java-код в Kotlin-код средствами IntelIDEA, инструмента (IDE) от JetBrains
- сравнить как можно (можно ли?) использовать новые семантические конструкции Kotlin для "уплотнения" кода Java

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: код Kotlin & Java

Непрочитанное сообщение Olej » 29 май 2017, 15:58

Olej писал(а):
Olej писал(а): Возьму готовое приложение на Java, которое я когда-то выписал на 15-ти разных языках программирования для сравнения, в том числе и Java.

Код: Выделить всё

[olej@dell Kotlin]$ ls *.java
Complex.java  triangle.java
Это именно приложение подходящее для подобных сравнений, потому что оно, с одной стороны, не примитивно простое, типа Hello World, а с другой - не построенное на достаточно громоздкой задаче-проекте, на изучение одной постановки, формулировки которой (никому по существу не нужной) нужно часы времени убить...

Код: Выделить всё

[olej@dell Kotlin]$ cat Makefile 
TASK = triangle.class

all: $(TASK)

triangle.class: Complex.java triangle.java
	javac triangle.java

clean:
	rm -f $(TASK) 

Код: Выделить всё

[olej@dell Kotlin]$ make
javac triangle.java

Код: Выделить всё

[olej@dell Kotlin]$ ls *.class
Complex.class  triangle.class  Tric.class

Код: Выделить всё

[olej@dell Kotlin]$ java triangle 
координаты вершин в формате: X Y
вершина № 1 : 0 0
вершина № 2 : 2 0
вершина № 3 : 0 2
вершин 3 : [0.0,0.0] [2.0,0.0] [0.0,2.0] 
периметр = 6.82842712474619
площадь = 2.0
---------------------------------
координаты вершин в формате: X Y
вершина № 1 : завершение работы
Вложения
Complex.java
(7.02 КБ) 104 скачивания
triangle.java
(2.63 КБ) 111 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: код Kotlin & Java

Непрочитанное сообщение Olej » 29 май 2017, 21:10

Olej писал(а): Вот попытка его прописания на Kotlin и будет:
- попыткой прописать туже задачу на 16-м языке программирования ...
- сравнением кода Java с кодом Kotlin
- автоматически трансформировать Java-код в Kotlin-код средствами IntelIDEA, инструмента (IDE) от JetBrains
- сравнить как можно (можно ли?) использовать новые семантические конструкции Kotlin для "уплотнения" кода Java
Всё, что касается инструментов (IDE и др.) и технологии (использования инструментария) будет совсем в другой теме, вот здесь: Kotlin.
Начиная с установки IntelliJ IDEA:
Изображение
Потому что трансформацию кода Java -> Kotlin умеет только IntelliJ IDEA ... естественно его использовать.

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: код Kotlin & Java

Непрочитанное сообщение Olej » 31 май 2017, 19:41

Olej писал(а): Возьму готовое приложение на Java, которое я когда-то выписал на 15-ти разных языках программирования для сравнения, в том числе и Java.
Вот попытка его прописания на Kotlin и будет:
- попыткой прописать туже задачу на 16-м языке программирования ...
- сравнением кода Java с кодом Kotlin
- автоматически трансформировать Java-код в Kotlin-код средствами IntelIDEA, инструмента (IDE) от JetBrains
- сравнить как можно (можно ли?) использовать новые семантические конструкции Kotlin для "уплотнения" кода Java
Выяснилась такая вот фича относительно приложения triangle.class:
- приложение, которое многократно собиралось и исполнялось в терминале, в CLI варианте... на протяжении нескольких лет...
- оно же, перенесенное в проект IDEA, замечательно компилируется...
- но при попытке выполнения (Run) из среды IDEA, слетает по исключению (см. картинку)
- но это же приложение (triangle.class), собранное в IDEA, замечательно запускается с CLI варианте (в терминале):

Код: Выделить всё

[olej@dell triangle.old]$ pwd
/home/olej/IdeaProjects/triangle.old/out/production/triangle.old

[olej@dell triangle.old]$ java triangle
координаты вершин в формате: X Y
вершина № 1 : 0 0
вершина № 2 : 1 0
вершина № 3 : 0 1
вершин 3 : [0.0,0.0] [1.0,0.0] [0.0,1.0] 
периметр = 3.414213562373095
площадь = 0.5
---------------------------------
координаты вершин в формате: X Y
вершина № 1 : 
ошибка ввода!: java.util.NoSuchElementException
вершина № 1 : завершение работы
Ошибка в среде IDEA происходит на операторе чтения консоли:

Код: Выделить всё

      Console cons = System.console();
      String szStr = "";
...
      szStr = cons.readLine( "%s%d%s", "вершина № ", i + 1, " : " );
Возникает ошибка, я в деталях не влезал, в различиях в терминальном вводе-выводе с GUI и CLI приложениях.
Вложения
i01.png

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: код Kotlin & Java

Непрочитанное сообщение Olej » 31 май 2017, 20:08

Olej писал(а):Возникает ошибка, я в деталях не влезал, в различиях в терминальном вводе-выводе с GUI и CLI приложениях.
Не желая вникать в детали возникновения проблемы, приложение пришлось полностью переделать. А раз уж переделывать, то будут использованы абстрактные коллекции Java, и приложение переделано так, что оно обсчитывает теперь не только треугольники, но и произвольные выпуклые многоугольники (так же, как в старом наборе приложений-сравнений на Python и др. языках).
Теперь приложение (poly.java) выглядит как-то так (название пришлось поменять, чтобы иметь возможность сравнивать выполнение со старым вариантом):

Код: Выделить всё

import java.io.*;
import java.util.*;
import java.lang.Double.*;

class Polygon extends ArrayList<Complex> {        // class Complex заимствуется из отдельного файла 
   public String toString()  {
      String ret = "";
      for( int i = 0; i < size(); i++ ) 
         ret += "[" + ( new Double( get( i ).re ) ).toString() + "," +
                      ( new Double( get( i ).im ) ).toString() + "] ";
       return ret;
   }
   public double perimeter() {
      double summa = 0.0;
      for( int i = 0; i < size(); i++ ) 
         summa += get( i ).minus( i != size() - 1 ? get( i + 1 ) : get( 0 ) ).r();
      return summa;
   }
   public double square() {
      double summa = 0.0;
      for( int i = 1; i < size() - 1; i++ ) {
         Complex side1 = get( i ).minus( get( 0 ) ),
                 side2 = get( i + 1 ).minus( get( 0 ) );
         summa += side1.r() * side2.r() *
                  Math.abs( Math.sin( side1.theta() - side2.theta() ) ) / 2.; 
      }
      return summa;
   }
} 

public class poly {
   public static void main( String[] args ) {
      Scanner in = new Scanner( System.in );      // создание объекта чтения из стандартного потока ввода
      while( true ) { 
         System.out.println( "координаты вершин в формате: X Y" );
         Polygon polygon = new Polygon();
         String coord = ""; 
         while( true ) { 
            System.out.printf( "%s%d%s", "вершина № ", polygon.size() + 1, " : " );
            try { coord = in.nextLine(); }        // чтение строки из консоли
            catch( java.util.NoSuchElementException ex ) {
               System.out.println( "завершение работы" );
               System.exit( 0 );                  // EOF: ^D
            }
            if( 0 == coord.length() ) 
               if( polygon.size() != 0 ) break;   // завершение многоугольника
               else {
                  System.out.println( "завершение работы" );
                  System.exit( 0 );
               }
            try {                                 // выделение координат
               StringTokenizer st = new StringTokenizer( coord, " \t\n" );
               double x = ( new Double( (String)st.nextElement() ) ).doubleValue(),
                      y = ( new Double( (String)st.nextElement() ) ).doubleValue();
               polygon.add( new Complex( x, y ) );
            }
            catch( java.util.NoSuchElementException ex ) {
               System.out.println( "ошибка ввода!: " + ex.toString() ); 
               continue;
            }
            catch( java.lang.NumberFormatException ex ) {
               System.out.println( "ошибка формата!: " + ex.toString() ); 
               continue;
            }
         }
         System.out.println( "вершин " + polygon.size() + " : " + polygon );
         System.out.println( "периметр = " + polygon.perimeter() );
         System.out.println( "площадь = " + polygon.square() );
         System.out.println( "---------------------------------" );
      }
   }
}   
Справка по нужным нам API здесь:
Class AbstractList<E>
Ввод данных с клавиатуры, Scanner
Вложения
poly.java
(3.28 КБ) 113 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: код Kotlin & Java

Непрочитанное сообщение Olej » 31 май 2017, 20:20

Olej писал(а): Теперь приложение (poly.java) выглядит как-то так
Вот теперь приложение идентично выполняется что в CLI, что в IDEA!

Код: Выделить всё

[olej@dell Kotlin]$ java poly
координаты вершин в формате: X Y
вершина № 1 : 1 1
вершина № 2 : -1 1
вершина № 3 : -1 -1
вершина № 4 : 1 -1
вершина № 5 :
вершин 4 : [1.0,1.0] [-1.0,1.0] [-1.0,-1.0] [1.0,-1.0]
периметр = 8.0
площадь = 4.0
---------------------------------
координаты вершин в формате: X Y
вершина № 1 : завершение работы
Вложения
i2.png

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: код Kotlin & Java

Непрочитанное сообщение Olej » 31 май 2017, 21:00

Olej писал(а): Вот теперь приложение идентично выполняется что в CLI, что в IDEA!
И теперь можно снова двигаться в направлении Kotlin.

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: код Kotlin & Java

Непрочитанное сообщение Olej » 02 июн 2017, 17:18

Olej писал(а):И теперь можно снова двигаться в направлении Kotlin.
Скопировал работающий проект triangle.java в новый проект triangle. Проверил работоспособность (корректность) созданного проекта.
Делаем автоматическое преобразование файлов .java в файлы .kt - меню: Code -> Convert Java File to Kotlin File.

Код: Выделить всё

[olej@dell src]$ pwd
/home/olej/IdeaProjects/triangle/src
[olej@dell src]$ ls
Complex.kt  poly.kt
После трансформации оба файла, и Complex.kt (который был мной взят где-то из публичной библиотеки в Интернет) и poly.kt (который написан под задачу) содержат синтаксические ошибки (с точки зрения семантики Kotlin).
Ошибки в poly.kt как-то связаны с конструктором Double, который "определён в kotlin.Double" и, нужно думать, отличается от определений в Java.
Вложения
k1.png
(15.15 КБ) 2574 скачивания
k2.png

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей