当前位置: 首页 > 知识库问答 >
问题:

改变流中的元素

章昆琦
2023-03-14

有没有一个“最佳实践”来改变流中的元素?我特别指的是流管道内的元素,而不是流管道外的元素。

例如,考虑这样的情况:我希望获取用户列表,为null属性设置默认值并将其打印到控制台。

class User {
    String name;

    static User next(int i) {
        User u = new User();
        if (i % 3 != 0) {
            u.name = "user " + i;
        }
        return u;
    }
}
for (int i = 0; i < 7; i++) {
    User user = User.next(i);
    if(user.name == null) {
        user.name = "defaultName";
    }
    System.out.println(user.name);
}
IntStream.range(0, 7)
    .mapToObj(User::next)
    .map(user -> {
        if (user.name == null) {
            user.name = "defaultName";
        }
        return user;
    })
    //other non-terminal operations
    //before a terminal such as .forEach or .collect
    .forEach(it -> System.out.println(it.name));

编辑:官方的流java文档声明了少量的流操作,如forEach()和peek(),只能通过副作用来操作;这些应该小心使用。“鉴于这将是一个不干涉的行动,有什么特别使它危险呢?我所看到的例子涉及到管道之外,这显然是粗略的。

共有1个答案

商勇
2023-03-14

不要突变对象,直接映射到名称:

IntStream.range(0, 7)
    .mapToObj(User::next)
    .map(user -> user.name)
    .map(name -> name == null ? "defaultName" : name)
    .forEach(System.out::println);
 类似资料:
  • 我想用Java 8编写纯函数,它将集合作为参数,对集合每个对象应用一些更改,并在更新后返回一个新集合。我希望遵循FP原则,所以我不希望更新/修改作为参数传递的集合。 有没有什么方法可以通过Stream API做到这一点,而不首先创建原始集合的副本(然后使用forEach或'normal'for循环)? 下面的示例对象,并假设我要将文本追加到object属性之一: 所以我想做一些类似下面的事情,但不

  • 我正在创建IPTV应用程序。在这种情况下,Exoplayer用于视频流,现在的要求是在运行时改变视频质量(自动,720p,1080p,高清),就像YouTube一样。 我已经找到了2-3个解决方案,但我不明白如何实现这一点。

  • 我想使用这种技术并更改SVG颜色,但到目前为止我还没能这样做。我把这个放在CSS中,但我的图像总是黑色的,不管怎么样。 我的代码: null null

  • 我打算将2D中布尔数组的值从True更改为false,但代码不起作用。即使我使用语句B[r][c]=false,输出结果也是一样的。有人能帮我吗,谢谢。

  • 我有一个我搜索的对象,该对象存储在一个流中。我想让用户能够修改现有流中的元素,并用修改后的元素更新现有列表,而不是创建一个新的列表。这个问题与这个问题相似,只是用户正在将修改后的元素添加到一个新的列表中 项目类别

  • 我有一个java流,其中我必须只对一些对象应用操作,但我希望得到具有相同元素数的流。例如 我有用户类。 我想增加50个现有余额为500或以上的用户的余额。在返回列表中,我还需要未修改余额的用户, 回报应该是 和原来的顺序一样,但是记录被修改了,这符合条件。任何想法我怎么能用流和功能方式做到这一点,没有如果,等等 我尝试了方法,但它只是将过滤后的值传递到下游。