起初我是学 1.7 版本 JAVA,那时以为 1.7 API 很好用,应该够用。但到了职场上,发现 JDK 1.8 的使用似乎变主流,我自己去看发现变化很多,其中 lambda 方式变成是 JDK 1.8 重要的物件。以下列出了基本的函数式介面
public interface Function<T, R> {
R apply(T t);
}
传入 T
回传 R
@FunctionalInterface
public interface BiFunction<T, U, R> {
R apply(T t, U u);
}
传入两个参数 T
、U
,回传 R
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
传入 T
回传 void
@FunctionalInterface
public interface BiConsumer<T, U> {
void accept(T t, U u);
}
传入 T
、U
,回传 void
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
传入 T
回传 boolean
@FunctionalInterface
public interface BiPredicate<T, U> {
boolean test(T t, U u);
}
传入 T
、U
,回传 boolean
@FunctionalInterface
public interface Supplier<T> {
T get();
}
不接受参数,回传 T
只不过在开发上目前比较常用的是 forEach
、map
、filter
、optional
等。但通常要使用这些的方式都要先将资料转成 stream
以下为范例
Array to stream
int[] array = {1,2,3,4,5};
Arrays.stream(array);
collection to stream
List<String> list = Arrays.asList("a", "b", "c", "d");
Arrays.stream(list);
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
// -> is lambda
map.forEach((k, v) -> System.out.println("Key : " + k + ", Value : " + v));
// output
Key : A, Value : 1
Key : B, Value : 2
Key : C, Value : 3
List<String> list = Arrays.asList("a", "b", "c");
// 透过 map 将所有字母都转大写,最後用 collect 方式在将结果封装成 List 回传
List<String> collect = list.stream().map(String::toUpperCase).collect(Collectors.toList());
// getById 是一个从 SQL 映射回来的资料,并从中获取 ecu 这个 List,接着将 List 转 stream 并使用 filter 进行过滤,过滤的结过只要回传第一个结果(findFirst)
Optional<Ecu> ecu = getById.getEcus()
.stream().filter(i -> i.getId().equals(ecuClassId)).findFirst();
// 这边回传了一个Optional使我们可以针对 null 这个值进行细节处理
// 如果有值我就做什麽
if (ecu.isPresent()) {
// do something
// 要取值透过 get()
ecu.get();
}
代表一个值存在或不存在。可以避免 NullPointer 异常。
Optional<Employee> op = Optional.of(new Employee()); // of 参数不能为 null,较好发现 null 值在哪
Employee emp = op.get();
System.out.println(emp); // 输出默认值
反正一堆东西可以玩,跟本学步完...
<<: 从 IT 技术面细说 Search Console 的 27 组数字 KPI (8) :KPI 层级
>>: Amazon Linux 2 上将 Django 与 Nginx 整合 -Day 08
Spanner ?,跟 Cloud SQL 一样,是一种 RDBMS (Relational Dat...
标签图片的方法与实作 - Day 12 资料增量 (Data Augmentation) 的部份因为...
Model 资料层 在开发应用程序的过程里,我们通常会定义 Model 的类别用来处理资料结构或是资...
最近进了一个公会群,发现当有新成员进来时管理员还需要问他们ID才能把他们邀进游戏里的工会 新成员进来...
坦白说这个课题,很多菜鸟常常没注意,但老鸟起手势马上就会做这件事,建立范本Template。 我第一...