我想找出一个简单的实现等同于Java的8 流,让我去探索的查询算法计算懒洋洋的发展(如map(),filter(),reduce(),等).注意:实现比Stream更好的解决方案不是我的目标.另一方面,我唯一的目标是了解Stream内部.
然而,我发现的每个实现都基于Iterable<T>,例如以下答案中提供的解决方案:
然而,我对这些解决方案感到不舒服,因为:
Spliterator<T>方法Stream<T>.我知道这Spliterator<T>是为了允许分区和并行处理,但我认为它的独特迭代器方法(boolean tryAdvance(Consumer<t>))可以被利用到新的替代品而不是上面列出的那些.此外,正如Brian Goetz所述:
SpliteratorIterator即使没有并行性,也是更好的.(他们通常也更容易写,更容易出错.)
那么,是否有可能开发出一种更易读,更简单,更简洁,更灵活的查询API实现,并且基于相同的原理Stream<T>(并行处理部分除外)?
如果是的话,你怎么能这样做?我希望看到比上面列出的更简单的实现,如果可能的话,利用新的Java 8功能.
要求:
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
我是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()函数随时使用流.我仍然得到" 流已经被操作或关闭 ".
请帮助我理解,使用来自供应商的流是否有任何限制?
我正在使用此问题的解决方案对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键.我不明白我在这里做错了什么.
看到问题的评论。有选择地删除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) 我需要根据需要按顺序执行的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)
我们可以改进这段代码吗?我不确定是否有办法重用第一个流来评估所有标准.
我有一个课程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) 我有一个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(c -> c.overHeadPercentage(),
Collectors.mapping(p -> (Course) p, Collectors.toList()))
Run Code Online (Sandbox Code Playgroud) 我试图建立一个值的名称地图.我有这个方法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语法错误.我觉得这应该是微不足道的,但它却在逃避我.任何帮助都是极好的...
下面的代码创建空的地图Stream使用lambda expression和下一行用于输出的任何元素的信息流中.但是在运行代码时它会产生无限的输出.我不知道为什么,因为它应该打印{}一次因为地图是空的.有人可以解释发生了什么吗?
Stream<Map<String,String>> mapStream = Stream.generate(() -> {
return Collections.emptyMap();
});
mapStream.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud) 自从这个方法
Stream.of(T... values)
Run Code Online (Sandbox Code Playgroud)
包括单个元素的情况,为什么方法:
Stream.of(T t)
Run Code Online (Sandbox Code Playgroud)
还包括在API中?它的目的是什么?什么时候被调用?它与varargs版本有什么不同吗?
java-stream ×10
java ×8
java-8 ×8
lambda ×4
collections ×1
dictionary ×1
hashmap ×1
list ×1
optional ×1
return ×1
sorting ×1
string ×1