JAVA 8 的使用

起初我是学 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);
}

传入两个参数 TU,回传 R

@FunctionalInterface
public interface Consumer<T> {
  void accept(T t);
}

传入 T 回传 void


@FunctionalInterface
public interface BiConsumer<T, U> {
  void accept(T t, U u);
}

传入 TU,回传 void

@FunctionalInterface
public interface Predicate<T> {
  boolean test(T t);
}

传入 T 回传 boolean

@FunctionalInterface
public interface BiPredicate<T, U> {
    boolean test(T t, U u);
}

传入 TU,回传 boolean

@FunctionalInterface
public interface Supplier<T> {
    T get();
}

不接受参数,回传 T

只不过在开发上目前比较常用的是 forEachmapfilteroptional 等。但通常要使用这些的方式都要先将资料转成 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);

forEach 范例

      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

map 范例

List<String> list = Arrays.asList("a", "b", "c");
// 透过 map 将所有字母都转大写,最後用 collect 方式在将结果封装成 List 回传
List<String> collect = list.stream().map(String::toUpperCase).collect(Collectors.toList());

filter 范例

// 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();
}

Optional 范例

代表一个值存在或不存在。可以避免 NullPointer 异常。

  • Optional.of(T t)
    • 创建一个 Optional 实例
Optional<Employee> op = Optional.of(new Employee()); // of 参数不能为 null,较好发现 null 值在哪
Employee emp = op.get();
System.out.println(emp); // 输出默认值
  • Optional.empty()
    • 创建一个空的 Optional 实例
    • get 不到值
  • Optional.ofNullable(T t)
    • 若 t 不为 null,创建 Optional 实例,否则创建空实例
    • get 不到值
  • isPresent()
    • 断是否包含值
  • orElse(T t)
    • 如果调用物件包含值,返回该值,否则返回 t
  • orElseGet(Supplier s)
    • 如果调用物件包含值,返回该值,否则返回 s 获取的值
  • map(Function f)
    • 如果有值对其处里,并返回处里後的 Optional,否则返回 Optional.empty()
  • flatMap(Function mapper)
    • 与 map 类似,要求返回值必须是 Optional

其它好用的 stream 用法

  • filter
    • 过滤某些元素
  • limit
    • 截断
  • skip
    • 跳过元素
  • distinct
    • 去重
    • 透过 hashCode() 和 equals() 去除重覆元素
  • sorted()
    • 自然排序
  • sorted(Compareator com)
    • 制定排序
  • allMatch(Predicate p)
    • 检查是否颇配所有元素
  • anyMatch(Predicate p)
    • 检查是否至少匹配一个元素
  • noneMatch(Predicate p)
    • 检查是否没有匹配所有元素
  • findFirst()
    • 返回第一个元素
  • findAny()
    • 返回当前 stream 中的任意元素
  • count()
    • 返回 stream 中元素总个数
  • max
    • 返回 stream 中最大值
  • min
    • 返回 stream 中最小值

反正一堆东西可以玩,跟本学步完...


<<:  从 IT 技术面细说 Search Console 的 27 组数字 KPI (8) :KPI 层级

>>:  Amazon Linux 2 上将 Django 与 Nginx 整合 -Day 08

[Day10] Cloud Spanner

Spanner ?,跟 Cloud SQL 一样,是一种 RDBMS (Relational Dat...

标签图片的方法与实作 - Day 12

标签图片的方法与实作 - Day 12 资料增量 (Data Augmentation) 的部份因为...

Flutter体验 Day 22-Model

Model 资料层 在开发应用程序的过程里,我们通常会定义 Model 的类别用来处理资料结构或是资...

[DAY 08]新成员进来时靠bot进行说明事项

最近进了一个公会群,发现当有新成员进来时管理员还需要问他们ID才能把他们邀进游戏里的工会 新成员进来...

Day13 Naming Rule & Template & 建构管理

坦白说这个课题,很多菜鸟常常没注意,但老鸟起手势马上就会做这件事,建立范本Template。 我第一...