Java 8 Stream API转换到Kotlin集合API

Kotlin提供的集合操作的API相对Java 8 Stream的API简洁很多。

下面是Java 8 Stream API转换到Kotlin集合API。 

映射属性聚合为列表

// Java:  
List<String> names = users.stream().map(User::getName).collect(Collectors.toList());

// Kotlin:
val list = user.map { it.name }  // 不需要toList(),很简洁

转换元素为字符串并用逗号链接

// Java:
String joined = users.stream().map(User::toString).collect(Collectors.joining(", "));

// Kotlin:
val joined = users.joinToString(", ")

计算薪资总数

// Java:
int total = employees.stream()
                      .collect(Collectors.summingInt(Employee::getSalary)));
// Kotlin:
val total = employees.sumBy { it.salary }

分组

// Java:
Map<Department, List<Employee>> byDept
     = employees.stream()
                .collect(Collectors.groupingBy(Employee::getDepartment));
// Kotlin:
val byDept = employees.groupBy { it.department }

分组统计

// Java:
Map<Department, Integer> totalByDept
     = employees.stream()
                .collect(Collectors.groupingBy(Employee::getDepartment,
                     Collectors.summingInt(Employee::getSalary)));
// Kotlin:
val totalByDept = employees.groupBy { it.dept }.mapValues { it.value.sumBy { it.salary }}

分片

// Java:
Map<Boolean, List<Student>> passingFailing =
     students.stream()
             .collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD));
// Kotlin:
val passingFailing = students.partition { it.grade >= PASS_THRESHOLD }

过滤映射

// Java:
List<String> namesOfMaleMembers = roster
    .stream()
    .filter(p -> p.getGender() == Person.Sex.MALE)
    .map(p -> p.getName())
    .collect(Collectors.toList());
// Kotlin:
val namesOfMaleMembers = roster.filter { it.gender == Person.Sex.MALE }.map { it.name }

分组元素,映射元素属性并聚合为列表

// Java:
Map<Person.Sex, List<String>> namesByGender =
      roster.stream().collect(
        Collectors.groupingBy(
            Person::getGender,                      
            Collectors.mapping(
                Person::getName,
                Collectors.toList())));
// Kotlin:
val namesByGender = roster.groupBy { it.gender }.mapValues { it.value.map { it.name } }

过滤列表元素

// Java:
List<String> filtered = items.stream()
    .filter( item -> item.startsWith("o") )
    .collect(Collectors.toList());
// Kotlin:
val filtered = items.filter { it.startsWith('o') } 

查找列表最短的字符串

// Java:
String shortest = items.stream()
    .min(Comparator.comparing(item -> item.length()))
    .get();
// Kotlin:
val shortest = items.minBy { it.length }

过滤列表并统计总数

// Java:
long count = items.stream().filter( item -> item.startsWith("t")).count();
// Kotlin:
val count = items.filter { it.startsWith('t') }.size
// 不需要filter直接统计
val count = items.count { it.startsWith('t') }

版权声明:著作权归作者所有。

相关推荐

Java使用Gradle依赖配置compile,implementation和api的区别

这个主要看Java项目所使用的Gradle的版本。Gradle3.4新增了Java-library插件,java-library插件使用了新的依赖配置implementation和api。旧的依赖配置compile被废弃。Gradle3.4之前的版本java插件apply plugin: 'java' 添加依赖dependencies { compile '

Java 8使用parallel Stream测试StringBuilder线程安全

我们知道StringBuilder不是线程安全的,但如何证明它非线程安全呢?测试StringBuilder是否线程安全一个简单的思路如下:模拟多个线程并发向StringBuilder实例添加字符,最后检测builder.toString().length()的值是否为添加字符的次数,如果非线程安全会出现builder.toString().length()的值与添加字符的次数不一致。Java&nb

Kotlin集合扩展函数 - 转换

Kotlin 集合类型提供了很多用于转换的扩展函数。这里需要指出示例里的intList为val intList: List<I­nt> = listOf(1, 2, 3) associate关联函数:使用转换函数把Array或Iterable转换为Map:数组fun <T, K, V> any_array

Java8使用Lambda把List转换为Map

使用Java8的Collections可以很简便地把List转换为Map以User为例List里的User名字唯一Map<String, User> result =     users.stream().collect(Collectors.toMap(User::getName,   &nbs

Kotlin集合扩展函数 - 创建集合

Kotlin标准包提供了一系列的扩展函数用来创建集合,包括Array,List,Set,Map以及可变集合。这里需要指出示例里的intList为val intList: List<I­nt> = listOf(1, 2, 3) Array创建数组基本方式val intArray: Array<­Int

Gradle配置implementation、api与compile的区别

自Gradle 3.4开始,compile被废弃,取而代之的是implementation和api两个配置项。掌握这三者的区别实际上就是要清楚什么情况使用implementation替换compile,什么情况下使用api替换compile。implementation替换compile使用implementation配置依赖,对Gradle来说:编译时:不允许外部模块调用此依赖包,除非