Java8-Lambda(1)

匿名内部类实现

匿名内部类仍然是一个类,只是不需要程序员显示指定类名,编译器会自动为该类取名。因此如果有如下形式的代码,编译之后将会产生两个class文件

public class Main {
    public static void main(String[] args) {
        new Thread(new Runnable(){
            @Override
            public void run(){
                System.out.println("hello");
            }
        }).start();
    }
}

Lambda表达式实现

Lambda表达式通过invokedynamic指令实现,书写Lambda表达式不会产生新的类。如果有如下代码,编译之后只有一个class文件

既然Lambda表达式不是内部类的简写,那么Lambda内部的this引用也就跟内部类对象没什么关系了。在Lambda表达式中this的意义跟在表达式外部完全一样

public class Main {
    public static void main(String[] args) {
        new Thread(
                () -> System.out.println("hello")
            ).start();
    }
}

集合常用方法

// 删除长度大于3的元素
list.removeIf(str -> str.length()>3); 

//所有长度大于3的元素转换成大写,其余元素不变
list.replaceAll(str -> {        
    if(str.length()>3)
        return str.toUpperCase();
    return str;
});

//排序
list.sort((str1, str2) -> str1.length()-str2.length());

//Map循环
map.forEach((k, v) -> System.out.println(k + "=" + v));

//有则返回,无则返回默认"NoValue"
map.getOrDefault(4, "NoValue");

//如果"key"不存在,则put "value"
map.putIfAbsent("key","value")

//替换所有的value大写
map.replaceAll((k, v) -> v.toUpperCase());

//循环
Stream.of("I", "love", "you", "too").forEach(str -> System.out.println(str));

//过滤
Stream.of("I", "love", "you", "too").filter(str -> str.length()==3).forEach(str -> System.out.println(str));

//去重
 Stream.of("I", "love", "you", "too", "too").distinct()
    .forEach(str -> System.out.println(str));

//排序   
Stream.of("I", "love", "you", "too").sorted((str1, str2) -> str1.length()-str2.length()).forEach(str -> System.out.println(str));

//对每个元素按照某种操作进行转换,转换前后Stream中元素的个数不会改变,但元素的类型取决于转换之后的类型。
Stream.of("I", "love", "you", "too").map(str -> str.toUpperCase()).forEach(str -> System.out.println(str));

reduce()

reduce操作可以实现从一组元素中生成一个值,sum()、max()、min()、count()等都是reduce操作,将他们单独设为函数只是因为常用

//返回最大的值
Optional<String> longest = stream.reduce((s1, s2) -> s1.length()>=s2.length() ? s1 : s2);
//Optional<String> longest = stream.max((s1, s2) -> s1.length()-s2.length());

//累加
Integer lengthSum = stream.reduce(0, // 初始值 // (1)
        (sum, str) -> sum+str.length(), // 累加器 // (2)
        (a, b) -> a+b); // 部分和拼接器,并行执行时才会用到 // (3)
// int lengthSum = stream.mapToInt(str -> str.length()).sum();

//转list
List<String> list = stream.collect(Collectors.toList());
//转set
Set<String> set = stream.collect(Collectors.toSet());
//转map
//Function.identity()等价于t->t
Map<String, Integer> map = stream.collect(Collectors.toMap(Function.identity(), String::length)); // (3)

// 使用toCollection()指定规约容器的类型
ArrayList<String> arrayList = stream.collect(Collectors.toCollection(ArrayList::new));// (3)
HashSet<String> hashSet = stream.collect(Collectors.toCollection(HashSet::new));// (4)

// 使用toMap()统计学生GPA
Map<Student, Double> studentToGPA =students.stream().collect(Collectors.toMap(Functions.identity(),student -> computeGPA(student)));

//把集合分为两部分,满足条件,或不满足
Map<Boolean, List<Student>> passingFailing = students.stream()
         .collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD));

//按照某个属性对数据进行分组,属性相同的元素会被对应到Map的同一个key上
Map<Department, List<Employee>> byDept = employees.stream()
           .collect(Collectors.groupingBy(Employee::getDepartment));

// 先分组,然后统计
Map<Department, Integer> totalByDept = employees.stream()
           .collect(Collectors.groupingBy(Employee::getDepartment,                                           Collectors.counting()));// 下游收集器

// 按照部门对员工分布组,并只保留员工的名字
Map<Department, List<String>> byDept = employees.stream()                .collect(Collectors.groupingBy(Employee::getDepartment,
                        Collectors.mapping(Employee::getName,
                                Collectors.toList())));

// 使用Collectors.joining()拼接字符串
Stream<String> stream = Stream.of("I", "love", "you");
String joined = stream.collect(Collectors.joining());// "Iloveyou"
String joined = stream.collect(Collectors.joining(","));// "I,love,you"
String joined = stream.collect(Collectors.joining(",", "{", "}"));// "{I,love,you}"
发布了15 篇原创文章 · 获赞 5 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章