无极安卓网多重安全检测下载网站、值得信赖的软件下载站!

当前位置: 无极安卓网 >  攻略 >  steam flatmsp

steam flatmsp Java 8 Steam API map和flatMap方法区别及应用场景介绍

时间:2023-04-29 11:18:07

小编:无极安卓网

steam flatmsp,Steam是一款广受欢迎的游戏平台,而Java 8中的Steam API更是为开发者提供了许多方便实用的方法,其中就包括map和flatMap方法。虽然这两种方法都可以对流中的元素进行处理,但是它们之间还是存在着一些区别。本文将介绍map和flatMap方法的工作原理以及使用场景,帮助读者更好地理解和应用这些方法。

Java 8 Steam API map和flatMap方法区别及应用场景介绍

steam flatmsp Java 8 Steam API map和flatMap方法区别及应用场景介绍map方法

我们来看个示例:把一个整数列表转换成字符串列表,java 8之前常用的实现方法如下

List<Integer> numList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
List<String> strList = new ArrayList<>();
for (int num : numList) {
    strList.add(Integer.toString(num));
}

这种写法比较符合直觉,但略显繁琐。如果用java 8的stream api的map方法则可以把这个过程变的非常简洁

List<String> strList = numList.stream()
        .map(it -> Integer.toString(it))
        .collect(Collectors.toList());

map方法接受一个lambda表达式,这个表达式是一个函数,输入类型是集合元素的类型,输出类型是任意类型

it -> Integer.toString(it)

在示例中就是将集合中的整数元素逐个转换成字符串类型。这种写法和常规的编程思路不同,却有点像SQL

select id from table1

这条SQL语句读取一张表的id字段,id是int类型,我们将他转换成字符类型,实现方法如下

select cast(id as CHAR(10)) as id from table1

SQL中的select对应的是map方法

cast(id as CHAR(10)) 对应的就是 it -> Integer.toString(it)

我们还可以用map实现很多效果,比如转换成符合要求的bool列表

List<Boolean> boolList = numList.stream()
        .map(it -> it > 5 ? true : false)
        .collect(Collectors.toList());

或者转换成某种对象列表

public class Main {
    private static class Klass {
        private int field;
 
        public Klass(int field) {
            this.field = field;
        }
 
        @Override
        public String toString() {
            return "field=" + field;
        }
    }
 
    public static void main(String[] args) {
        List<Integer> numList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
        List<Klass> objList = numList.stream()
                .map(it -> new Klass(it))
                .collect(Collectors.toList());
    }
}

都可以非常迅速的实现,和那些流水账式的代码告别

List<Klass> objList2 = new ArrayList<>();
for (int num : numList) {
    objList2.add(new Klass(num));
}

其实这种写法就是函数式编程的声明性编程,将代码写成表达式类型。而我们常用的SQL语言天生就是函数式语言。

flatMap方法

我们把需求扩展下

先定义两个类型

private static class Klass {
    private int field;

    public Klass(int field) {
        this.field = field;
    }

    @Override
    public String toString() {
        return "field=" + field;
    }
}

private static class KlassGroup {
    private List<Klass> group = new ArrayList<>();

    public KlassGroup(Klass... objList) {
        for (Klass item : objList) {
            this.group.add(item);
        }
    }

    public List<Klass> getKlassList() {
        return group;
    }
}

KlassGroup类中定义了一个Klass类的列表

现在我们有一组KlassGroup对象

List<KlassGroup> groupList = Arrays.asList(
        new KlassGroup(new Klass(1), new Klass(2), new Klass(3)),
        new KlassGroup(new Klass(4), new Klass(5), new Klass(6)),
        new KlassGroup(new Klass(7), new Klass(8), new Klass(9)),
        new KlassGroup(new Klass(10))
);

需要将每个KlassGroup对象中的那些Klass类取出来,放到一个ArrayList里面,得到一个List<Klass>。我们尝试着用map方法来实现

List<List<Klass>> result = groupList.stream()
        .map(it -> it.getKlassList())
        .collect(Collectors.toList());

哈,不成功,我们想要的结果是List<Klass>,现在得到了 List<List<Klass>>。当然,我们可以轻而易举的解决这个问题

List<Klass> result2 = new ArrayList<>();
for (KlassGroup group : groupList) {
    for (Klass klass : group.getKlassList()) {
        result2.add(klass);
    }
}

但是这种套了两层for循环的代码太丑陋了。面对这种需求,flatMap可以大展身手了

List<Klass> result3 = groupList.stream()
        .flatMap(it -> it.getKlassList().stream())
        .collect(Collectors.toList());

一行代码就实现了

stream api 的 flatMap方法接受一个lambda表达式函数, 函数的返回值必须也是一个stream类型。flatMap方法最终会把所有返回的stream合并,map方法做不到这一点,如果用map去实现,会变成这样一个东西

List<Stream<Klass>> result3 = groupList.stream()
        .map(it -> it.getKlassList().stream())
        .collect(Collectors.toList());

flatMap的思路在其他语言中也有体现,比如C# Linq中的 SelectMany 方法,F# 中的 List.collect方法都有同样的作用。用函数式编程的说法,他们都实现了 monad,当然,monad这个概念很难是通俗的描述清楚,此文中就不展开了。

java 8 stream api 中各方法可以极大的简化集合操作,带来大幅度的编码效率提升。如果是java 8及以上的版本,一定要优先使用,stream api绝对是java中史诗级的工作效率提升利器。

总的来说,map方法和flatMap方法都是用于对Steam API中的数据进行转换和处理的函数。map方法用于将Steam API中的每个元素进行处理后返回一个新的Steam API,而flatMap方法则是将Steam API中的每个元素拆分成多个元素后再进行处理,最终返回一个新的Steam API。因此,在应用场景上,能够使用map方法的情况下就不必使用flatMap方法,只有当需要将Steam API中的每个元素拆分成多个元素后才需要使用flatMap方法。

相关文章

猜你喜欢

推荐游戏

更多