在Java 8中,我们有Stream <T>类,它奇怪地有一个方法
Iterator<T> iterator()
Run Code Online (Sandbox Code Playgroud)
所以你会期望它实现接口Iterable <T>,这需要完全这个方法,但事实并非如此.
当我想使用foreach循环遍历Stream时,我必须做类似的事情
public static Iterable<T> getIterable(Stream<T> s) {
return new Iterable<T> {
@Override
public Iterator<T> iterator() {
return s.iterator();
}
};
}
for (T element : getIterable(s)) { ... }
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么吗?
为什么Iterator界面没有扩展Iterable?
该iterator()方法可以简单地返回this.
它是故意还是只是对Java设计师的监督?
能够使用像这样的迭代器的for-each循环会很方便:
for(Object o : someContainer.listSomeObjects()) {
....
}
Run Code Online (Sandbox Code Playgroud)
where listSomeObjects()返回一个迭代器.
在Java 5及更高版本中,你有foreach循环,它可以在任何实现的东西上神奇地工作Iterable:
for (Object o : list) {
doStuff(o);
}
Run Code Online (Sandbox Code Playgroud)
但是,Enumerable仍然没有实现Iterable,这意味着迭代Enumeration你必须执行以下操作:
for(; e.hasMoreElements() ;) {
doStuff(e.nextElement());
}
Run Code Online (Sandbox Code Playgroud)
有谁知道有没有理由Enumeration仍然没有实现Iterable?
如何使用Jackson从JSON树接收节点名称?JSON-File看起来像这样:
{
node1:"value1",
node2:"value2",
node3:{
node3.1:"value3.1",
node3.2:"value3.2"
}
}
Run Code Online (Sandbox Code Playgroud)
我有
JsonNode rootNode = mapper.readTree(fileReader);
Run Code Online (Sandbox Code Playgroud)
并需要类似的东西
for (JsonNode node : rootNode){
if (node.getName().equals("foo"){
//bar
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
假设我们尝试向java 8流应用一个可能抛出已检查异常的lambda:
Stream<String> stream = Stream.of("1", "2", "3");
Writer writer = new FileWriter("example.txt");
stream.forEach(s -> writer.append(s)); // Unhandled exception: java.io.IOException
Run Code Online (Sandbox Code Playgroud)
这不会编译.
一种解决方法是嵌套已检查的异常,RuntimeException但它使以后的异常处理变得复杂,而且它只是丑陋:
stream.forEach(s -> {
try {
writer.append(s);
} catch (IOException e) {
throw new RuntimeException(e);
}
});
Run Code Online (Sandbox Code Playgroud)
另一种解决方法可能是转换有限的功能forEach,以普通的旧的foreach 循环是比较友好的检查的异常.
但天真的方法失败了:
for (String s : stream) { // for-each not applicable to expression type 'java.util.stream.Stream<java.lang.String>'
writer.append(s);
}
for (String s : stream.iterator()) { // foreach not applicable to type 'java.util.Iterator<java.lang.String>'
writer.append(s);
} …Run Code Online (Sandbox Code Playgroud) 当我使用对象的Iterator时,我使用while循环(如每本书中学习Java,如Bruce Eckel的Thinking in Java):
Iterator it=...
while(it.hasNext()){
//...
}
Run Code Online (Sandbox Code Playgroud)
但有时我看到的是有人使用for循环:
Iterator it=...
for (Iterator it=...; it.hasNext();){
//...
}
Run Code Online (Sandbox Code Playgroud)
我不明白这个选择:
counter++.这是一个没有其他原因的样式编码问题,或者存在一些我不知道的其他逻辑(例如性能)?
感谢您的每一个反馈
说实话,我不太确定自己是否理解这个任务:)我被告知创建类MySimpleIt,它实现了Iterator和Iterable,并允许运行提供的测试代码.对象的参数和变量不能是集合或数组.
代码 :
MySimpleIt msi=new MySimple(10,100,
MySimpleIt.PRIME_NUMBERS);
for(int el: msi)
System.out.print(el+" ");
System.out.println();
msi.setType(MySimpleIterator.ODD_NUMBERS);
msi.setLimits(15,30);
for(int el: msi)
System.out.print(el+" ");
System.out.println();
msi.setType(MySimpleIterator.EVEN_NUMBERS);
for(int el: msi)
System.out.print(el+" ");
System.out.println();
Run Code Online (Sandbox Code Playgroud)
我应该得到的结果:
11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
15 17 19 21 23 25 27 29
16 18 20 22 24 26 28 30
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
import java.util.Iterator;
interface MySimpleIterator{
static int ODD_NUMBERS=0;
static int EVEN_NUMBERS = 1;
static …Run Code Online (Sandbox Code Playgroud) java ×7
iterable ×3
iterator ×3
for-loop ×2
java-8 ×2
java-stream ×2
enumeration ×1
foreach ×1
interface ×1
iteration ×1
jackson ×1
json ×1
while-loop ×1