美文网首页
java8新特性之流式处理

java8新特性之流式处理

作者: 后来丶_a24d | 来源:发表于2019-12-21 14:28 被阅读0次

目录


简介

  • 集合,包括数组、文件等,只要是可以转换成流,可以借助流式处理


    流式处理图.png
  • 更多含义可参考最底下的参考文章。
  • 流是懒加载的。这代表着它只在绝对必要时才计算。你可以将流看作“延迟列表”。由于计算延迟,流使我们能够表示非常大(甚至无限)的序列,而不需要考虑内存问题

实例

将SearchHit[]转换成 List<ESSearchHit>

 List<ESSearchHit> hits = new ArrayList<>();
 Arrays.asList(searchHits.getHits()).stream().forEach(item -> hits.add(new ESSearchHit(item)));

过滤掉偶数数据

List<Integer> evens = nums.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());

方法引用

  • 未绑定方法引用(如果将方法引用或 Lambda 表达式赋值给函数式接口(类型需要匹配),Java 会适配你的赋值到目标接口。 编译器会在后台把方法引用或 Lambda 表达式包装进实现目标接口的类的实例中。)
class X {
  String f() { return "X::f()"; }
}

interface MakeString {
  String make();
}

interface TransformX {
  String transform(X x);
}

public class UnboundMethodReference {
  public static void main(String[] args) {
    // 此方法时未绑定方法引用
    TransformX sp = X::f;
    X x = new X();
    // 此方法最终调用x.f()
    System.out.println(sp.transform(x)); 
    System.out.println(x.f()); // 同等效果
  }
}
  • 构造函数方法引用(有点像未绑定方法引用)
class Dog {
  String name;
  int age = -1;
  Dog(String nm) { name = nm; }
}

interface Make1Arg {
  Dog make(String nm);
}


public class CtorReference {
  public static void main(String[] args) {
    Make1Arg m1a = Dog::new;   
    Dog d1 = m1a.make("Comet");
  }
}
  • 被 Lambda 表达式引用的局部变量,参数必须是 final。
  1. 新开线程: 外部线程可能都执行完了,新开的线程还没执行完,用fianl延迟变量的生命周期,不然可能就找不到对应变量值了
  2. 内部类: 通常都含有回调,引用那个匿名内部类的函数执行完了就没了,所以内部类中引用外面的局部变量需要是final的,这样在回调的时候才能找到那个变量(延长生命周期),而如果是外围类的成员变量就不需要是final的,因为内部类本身都会含有一个外围了的引用(外围类.this),所以回调的时候一定可以访问到。为了避免:1. 外部方法修改引用,而导致内部类得到的引用值不一致 2.内部类修改引用,而导致外部方法的参数值在修改前和修改后不一致。
IntSupplier makeFun(int x) {
    Integer i = 0;
    i = i + 1;
    return () -> x + i;
}

IntSupplier makeFun1(int x) {
    int i = 0;
    // 同样规则的应用两个都无法通过编译:
     i++; // 非等同 final 效果
     x++; // 同上
    return new IntSupplier() {
        public int getAsInt() { return x + i; }
    };
}

new Thread(() -> {
    x = x + 3;
    System.out.println("ee");
});
  • 柯里化,多参数
public static void main(String[] args) {
  // 柯里化的函数:
  Function<String, Function<String, String>> sum =
     a -> b -> a + b; // [1]

  System.out.println(uncurried("Hi ", "Ho"));

  Function<String, String>
    hi = sum.apply("Hi "); // [2]
  System.out.println(hi.apply("Ho"));

  // 部分应用:
  Function<String, String> sumHi =
    sum.apply("Hup ");
  System.out.println(sumHi.apply("Ho"));
  System.out.println(sumHi.apply("Hey"));
}

参考文章

相关文章

网友评论

      本文标题:java8新特性之流式处理

      本文链接:https://www.haomeiwen.com/subject/rdrgnctx.html