标签: java-stream

如何实现Java 8 Stream流畅的API并且懒洋洋地计算

我想找出一个简单的实现等同于Java的8 流,让我去探索的查询算法计算懒洋洋的发展(如map(),filter(),reduce(),等).注意:实现比Stream更好的解决方案不是我的目标.另一方面,我唯一的目标是了解Stream内部.

然而,我发现的每个实现都基于Iterable<T>,例如以下答案中提供的解决方案:

然而,我对这些解决方案感到不舒服,因为:

  1. 他们太冗长了.
  2. 它们对于新的查询方法不灵活.包含新的查询方法需要进行结构修改.
  3. 尽管存在查询参数,但它们并没有利用新的Java 8功能,例如:第一类函数或默认方法.
  4. 他们都没有使用上面使用的Spliterator<T>方法Stream<T>.

我知道这Spliterator<T>是为了允许分区和并行处理,但我认为它的独特迭代器方法(boolean tryAdvance(Consumer<t>))可以被利用到新的替代品而不是上面列出的那些.此外,正如Brian Goetz所述:

SpliteratorIterator即使没有并行性,也是更好的.(他们通常也更容易写,更容易出错.)

那么,是否有可能开发出一种更易读,更简单,更简洁,更灵活的查询API实现,并且基于相同的原理Stream<T>(并行处理部分除外)?

如果是的话,你怎么能这样做?我希望看到比上面列出的更简单的实现,如果可能的话,利用新的Java 8功能.

要求:

  • 不要重用Java 8 API中的现有方法
  • 并行处理功能超出了本问题的范围.
  • 如果可能,更好,不要使用该Iterable<T>方法.

我的问题的原因?我认为学习查询API(如Stream)的最佳方法是尝试自己实现这些相同的方法.我在学习时已经成功完成了.net Linq.当然,我没有比Linq更好的实现,但这有助于我理解内部部分.所以,我试图按照相同的方法学习Stream.

这并不是那么不寻常.有以下这种方法对于其他技术,如许多作坊功能的JavaScript车间,其中大部分练习要求对现有方法这样实现:map(),filter(),reduce(),call(),bind(),等...

选择的答案:现在我认为米格尔·甘博亚的答案是我的选择,而不是Tagir Valeev的答案,因为后者不允许的implementaton findAny()或findFirst() …

collections lambda higher-order-functions java-8 java-stream

1
推荐指数
1
解决办法
1662
查看次数

溪流已经运营或关闭 - 供应商没有帮助

我是Java 8流编码的新手.这是一段代码,我正在尝试运行.

Supplier filteredSupplier = () -> Stream.of(filteredStream.toArray(Obj[]::new));
Stream.concat((Stream<Obj>)filteredSupplier.get(), Stream.of(objs)).forEach(some operation);
Run Code Online (Sandbox Code Playgroud)

据我所知,如果您使用供应商,您可以使用供应商的get()函数随时使用流.我仍然得到" 流已经被操作或关闭 ".

请帮助我理解,使用来自供应商的流是否有任何限制?

java java-stream

1
推荐指数
1
解决办法
370
查看次数

使用Java 8 Stream对HashMap字符串值进行排序不起作用

我正在使用此问题的解决方案对a中的String值进行排序LinkedHashMap.然而,排序根本不起作用.这是我写的代码.

Map<Integer, String> sortedMap = myMap.entrySet().stream()
                .sorted(Map.Entry.comparingByValue())
                .collect(Collectors.toMap(Map.Entry<Integer, String>::getKey, 
                    Map.Entry<Integer, String>::getValue));

myMap = new LinkedHashMap<Integer, String>(sortedMap);
Run Code Online (Sandbox Code Playgroud)

奇怪的是,Integer当使用两者comparingByValue和comparingByKey方法时,它正在对键进行排序.所以它肯定是排序,而不是String值,但在两种情况下都是Integer键.我不明白我在这里做错了什么.

java sorting hashmap java-8 java-stream

1
推荐指数
1
解决办法
1078
查看次数

使用Java 8从列表中有选择地删除前N个

看到问题的评论。有选择地删除N个元素(条件是列表元素匹配“删除”)

List<String> mylist = new ArrayList<>();
mylist.add("remove");
mylist.add("all");
mylist.add("remove");
mylist.add("remove");
mylist.add("good");
mylist.add("remove");

//  Remove first X "remove".
//  if X is 2, then result list should be "all, remove, good, remove"
//  Use java 8 features only, possibly single line code.
//  Please don't answer with looping, iterating, if conditions etc.
//  Answer should use JDK 8 new features.
Run Code Online (Sandbox Code Playgroud)

lambda list java-8 java-stream

1
推荐指数
1
解决办法
2139
查看次数

我们可以改进这段代码吗?

我需要根据需要按顺序执行的3个检查来选择第一个结果.即如果没有符合标准1的对象,那么我们寻找满足标准2的任何对象,依此类推.这是我的工作代码

MyClass result = myObjects.stream()
        .filter(s -> s.meetsCriterion1())
        .findFirst()
        .orElseGet(() -> {
            return myObjects.stream()
                .filter(s -> s.meetsCriterion2())
                .findFirst()
                .orElseGet(() -> {
                    return myObjects.stream()
                        .filter(s -> s.meetsCriterion3())
                        .findFirst()
                        .orElseGet(() -> {
                            return null;
                        });
                });
        });
Run Code Online (Sandbox Code Playgroud)

我们可以改进这段代码吗?我不确定是否有办法重用第一个流来评估所有标准.

java optional java-8 java-stream

1
推荐指数
1
解决办法
95
查看次数

从Java流返回字符串

我有一个课程Person,它存储每个人的代码和朋友列表.我正在尝试获取拥有最多朋友数量的人的代码,但无法弄明白.这些方法getFriends和getCode由提供Person类.

如何从流中返回字符串?

HashMap<String,Person> persons = new HashMap<>();

public String personWithLargestNumberOfFriends() {
    return persons.values().stream()
        .sorted(comparing(p -> ((Person)p).getFriends().size()).reversed())
        .limit(1)
        .forEach(p -> ((Person)p).getCode());
}
Run Code Online (Sandbox Code Playgroud)

java string return java-stream

1
推荐指数
1
解决办法
3397
查看次数

将<Integer,List <courseCLS >>映射到Map <Integer,List <Course >>

我有一个interface Course和一个class CourseCLS implements Course.

首先,我尝试CourseCLS用相同的数字对对象进行分组.我不确定它是否正确.

Map<Integer, List<CourseCLS>> first =
        courses.values().stream()
            .collect(Collectors.groupingBy(c -> c.getNumber()));
Run Code Online (Sandbox Code Playgroud)

现在,我需要改变Map<Integer, List<CourseCLS>>成Map<Integer, List<Course>>,然后返回.

有什么想法怎么做?

刚刚解决了将此添加到groupingBy:

groupingBy(c -> c.overHeadPercentage(),
    Collectors.mapping(p -> (Course) p, Collectors.toList()))
Run Code Online (Sandbox Code Playgroud)

java dictionary java-8 java-stream

1
推荐指数
1
解决办法
52
查看次数

如何防止java流两次运行相同的方法?

我试图建立一个值的名称地图.我有这个方法getValue两次调用该方法.一旦确保返回值不为null,然后再次实际收集该值.我试图弄清楚如何添加一个lambda块来捕获返回对象.

Arrays.stream(enums)
     .collect(Collectors.toMap(
          en -> en.name(), 
          en -> ((issue.getValue(en) != null) ? issue.getValue(en) : "")
      ));
Run Code Online (Sandbox Code Playgroud)

当我尝试不同的安排时,我不断收到各种IDE语法错误.我觉得这应该是微不足道的,但它却在逃避我.任何帮助都是极好的...

java lambda java-8 java-stream

1
推荐指数
2
解决办法
132
查看次数

Java 8无限流输出

下面的代码创建空的地图Stream使用lambda expression和下一行用于输出的任何元素的信息流中.但是在运行代码时它会产生无限的输出.我不知道为什么,因为它应该打印{}一次因为地图是空的.有人可以解释发生了什么吗?

 Stream<Map<String,String>> mapStream = Stream.generate(() -> {
        return Collections.emptyMap();
    });
    mapStream.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream

1
推荐指数
1
解决办法
446
查看次数

为什么库包含Stream.of(T t)和Stream.of(T ...值)?

自从这个方法

Stream.of(T... values)
Run Code Online (Sandbox Code Playgroud)

包括单个元素的情况,为什么方法:

Stream.of(T t)
Run Code Online (Sandbox Code Playgroud)

还包括在API中?它的目的是什么?什么时候被调用?它与varargs版本有什么不同吗?

java java-8 java-stream

1
推荐指数
1
解决办法
79
查看次数