Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
for(:) вместо for(in) или foreach, @interface вместо annotation и т.д.enum ввели в свое время.очень легко оступиться и поставить <= место < или начать с 1 вместо 0
public static int F(List<int> list) {
foreach (var i in list) {
if (i == 0) {
return 5;
}
Console.WriteLine(i);
}
return 10;
}
public static int F(List<int> list) {
list.ForEach(i => {
if (i == 2) {
return 5; // error CS0127: Since 'System.Action<int>' returns void, a return keyword must not be followed by an object expression
}
Console.WriteLine(i);
});
return 10;
}
def f(list: List[Int]): Int = {
list.foreach { x =>
if (x == -1) {
return 0
}
println(x)
}
list.sum
}
f(List(-1,0,1)) возвращает 0.2) Это могут и будут использовать неправильно
foo в интерфейсе Collection. foo в Collection, то вы (программист на Java) больше не сможете скомпилировать свой код, если где-то в вашем коде есть классы, реализующие любую коллекцию. Потому что у них метода foo. Вам придётся имплементировать метод foo в ваших реализациях. Поэтому и придуманы дефолтные реализации методов.interface Car {
void bump();
void beep();
void run(){ // этот код приходилось реализовывать везде где есть Car
bump();
beep();
}
}
Object. У вас по-прежнему в каждом дереве наследования будет своя копия кода для run(), и если в какой-то момент потребуется изменить поведение этого метода — изменения придется вносить во все имплементации. Методы в интерфейсах позволяют вообще выпилить подобную копипасту из проекта.Откуда возьмется «через D»
abstract A -> D -> Cс множественными глубокими иерархиями
run() все равно придется скопировать.interface Ordered<T> {
int compareTo(T other);
default boolean greater(T other) {
return this.compareTo(other) > 0;
}
default boolean less(T other) {
return this.compareTo(other) < 0;
}
default boolean greaterOrEqual(T other) {
return this.compareTo(other) >= 0;
}
default boolean lessOrEqual(T other) {
return this.compareTo(other) <= 0;
}
}
-target во время компиляции.indy. Другие реализации вольны делать всё, что им угодно. Например, в процессе компиляции заменять лямбды на семантически эквивалентные конструкции: генерировать статические методы в классе, где используется лямбда или генерить анонимные иннер-классы. И т.д. в том же духе.Collections.sort(numbers, (o1, o2)->-o1.compareTo(o2))Collections.sort(numbers, (o1, o2) -> -o1.compareTo(o2))o2.compareTo(o1)для более простого чтения кода. Хотя это скорее вопрос соглашений в компании.numbers.forEach(System.out::println);Да-да, мы передали статический метод в качестве функции.
В данном случае победит ближайший в иерархии, то есть интерфейс B. Ну а если хочется использовать метод интерфейса А, то нужно явно указать
A.super.hello();
Base64, как долго компилятор нам выдавал грозные сообщения об устаревшем sun.misc.Base64 и приходилось пользовать апачевские библиотеки для простой, казалось бы, вещи.
var x = point.getX()+2;
var y = point.getX()-3;
if(x==y) {
//...
}
For ordered streams, the sort is stable. For unordered streams, no stability guarantees are made.
В данном случае победит ближайший в иерархии, то есть интерфейс BПочему B? Ведь C реализует и A тоже.
Что Java 8 нам готовит