java8新特性之流式处理

2019-12-21  本文已影响0人  后来丶_a24d

目录


简介

实例

将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());

方法引用

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");
  }
}
  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"));
}

参考文章

上一篇 下一篇

猜你喜欢

热点阅读