java 8 lambda
在工作中,我进行了有关Java 8项目lambda的演示,当然还提供了一些简单的代码来说明一些要点。 Java 8的总体原因是:
- 更简洁的代码(适用于只有一种方法和集合的类)。 “我们希望代码阅读者在到达lambda表达式的“实质”之前,必须尽可能少地使用语法。” – Brian Goetz(http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html)
- 能够传递功能,而不仅仅是数据
- 更好地支持多核处理
所有示例都可以在从此处下载的以下Java 8版本上运行:
openjdk version "1.8.0-ea"
OpenJDK Runtime Environment (build 1.8.0-ea-lambda-nightly-h3876-20130403-b84-b00)
OpenJDK 64-Bit Server VM (build 25.0-b21, mixed mode)
最简单的情况:
public class ThreadA {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.err.println("Hello from anonymous class");
}
}).start();
}
}
public class ThreadB {
public static void main(String[] args) {
new Thread(() -> {
System.err.println("Hello from lambda");
}).start();
}
}
非正式地注意语法
()|x|(x,..,z) -> expr|stmt
箭头是新的运算符。 并注意第二段代码与第一段代码相比更为简洁。
集合:
首先让我介绍一个简单的领域和一些帮助者
public class Something {
private double amount;
public Something(double amount) {
this.amount = amount;
}
public double getAmount() {
return amount;
}
public String toString() {
return "Amount: " + amount;
}
}
public class Helper {
public static List<Something> someThings() {
List<Something> things = new ArrayList<>();
things.add(new Something(99.9));
things.add(new Something(199.9));
things.add(new Something(299.9));
things.add(new Something(399.9));
things.add(new Something(1199.9));
return things;
}
}
public interface Doer<T> {
void doSomething(T t);
}
让我们对Java 7样式进行一些过滤和排序:
public class CollectionA {
public static void main(String... args) {
List<Something> things = Helper.someThings();
System.err.println("Filter");
List<Something> filtered = filter(things);
System.err.println(filtered);
System.err.println("Sum");
double sum = sum(filtered);
System.err.println(sum);
}
public static List<Something> filter(List<Something> things) {
List<Something> filtered = new ArrayList<>();
for (Something s : things) {
if (s.getAmount() > 100.00) {
if (s.getAmount() < 1000.00) {
filtered.add(s);
}
}
}
return filtered;
}
public static double sum(List<Something> things) {
double d = 0.0;
for (Something s : things) {
d += s.getAmount();
}
return d;
}
}
现在是Java 8样式– 流式传输 :
import java.util.stream.Collectors;
public class CollectionB {
public static void main(String... args) {
List<Something> things = Helper.someThings();
System.err.println("Filter lambda");
List<Something> filtered = things.stream().parallel().filter( t -> t.getAmount() > 100.00 && t.getAmount() < 1000.00).collect(Collectors.toList());
System.err.println(filtered);
System.err.println("Sum lambda");
double sum = filtered.stream().mapToDouble(t -> t.getAmount()).sum();
System.err.println(sum);
}
}
导入java.util.function。*接口和方法参考
public class CollectionC {
public static void main(String... args) {
List<Something> things = Helper.someThings();
System.err.println("Do something");
doSomething(things, new Doer<Something>() {
@Override
public void doSomething(Something t) {
System.err.println(t);
}
});
}
public static void doSomething(List<Something> things, Doer<Something> doer) {
for (Something s : things) {
doer.doSomething(s);
}
}
}
将我们的Doer界面替换为标准的Consumer界面 (以前称为Block)
import java.util.function.Consumer;
public class CollectionD {
public static void main(String... args) {
List<Something> things = Helper.someThings();
System.err.println("Do something functional interfaces");
consumeSomething(things, new Consumer<Something>() {
@Override
public void accept(Something t) {
System.err.println(t);
}
});
System.err.println("Do something functional interfaces, using lambda");
consumeSomething(things, (t) -> System.err.println(t));
System.err.println("Do something functional interfaces, using lambda method reference (new operator ::) ");
consumeSomething(things, System.err::println);
System.err.println("Do something functional interfaces, using stream");
things.stream().forEach(new Consumer<Something>() {
@Override
public void accept(Something t) {
System.err.println(t);
}
});
System.err.println("Do something functional interfaces, using stream and method reference");
things.stream().forEach(System.err::println);
}
public static void doSomething(List<Something> things, Doer<Something> doer) {
for (Something s : things) {
doer.doSomething(s);
}
}
public static void consumeSomething(List<Something> things, Consumer<Something> consumer) {
for (Something s : things) {
consumer.accept(s);
}
}
}
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Optional;
import java.util.stream.Collectors;
public class Various {
public static void main(String... args) {
List<Something> things = Helper.someThings();
//Map
System.err.println(things.stream().map((Something t) -> t.getAmount()).collect(Collectors.toList()));
//Reduce
double d = things.stream().reduce(new Something(0.0), (Something t, Something u) -> new Something(t.getAmount() + u.getAmount())).getAmount();
System.err.println(d);
//Reduce again
System.err.println(things.stream().reduce((Something t, Something u) -> new Something(t.getAmount() + u.getAmount())).get());
//Map/reduce
System.err.println(things.stream().map((Something t) -> t.getAmount()).reduce(0.0, (x, y) -> x + y));
//Lazy
Optional<Something> findFirst = things.stream().filter(t -> t.getAmount() > 1000).findFirst();
System.err.println(findFirst.get());
//Lazy no value
Optional<Something> findFirstNotThere = things.stream().filter(t -> t.getAmount() > 2000).findFirst();
try {
System.err.println(findFirstNotThere.get());
} catch (NoSuchElementException e) {
System.err.println("Optional was not null, but its value was");
}
//Optional one step deeper
things.stream().filter(t -> t.getAmount() > 1000).findFirst().ifPresent(t -> System.err.println("Here I am"));
}
}
翻译自: https://www.javacodegeeks.com/2013/06/java-8-lambda-walkthrough.html
java 8 lambda