我正在阅读有关Java流和发现新事物的内容.我发现的新事物之一是peek()
功能.几乎所有我读过的内容都说它应该用来调试你的Streams.
如果我有一个Stream,每个帐户都有一个用户名,密码字段以及login()和loggedIn()方法,该怎么办?
我也有
Consumer<Account> login = account -> account.login();
Run Code Online (Sandbox Code Playgroud)
和
Predicate<Account> loggedIn = account -> account.loggedIn();
Run Code Online (Sandbox Code Playgroud)
为什么会这么糟糕?
List<Account> accounts; //assume it's been setup
List<Account> loggedInAccount =
accounts.stream()
.peek(login)
.filter(loggedIn)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
现在据我所知,这完全符合它的目的.它;
做这样的事情的缺点是什么?有什么理由我不应该继续吗?最后,如果不是这个解决方案呢?
其原始版本使用.filter()方法如下;
.filter(account -> {
account.login();
return account.loggedIn();
})
Run Code Online (Sandbox Code Playgroud) 我无法弄清楚如何在Python生成器中展望一个元素.一看,它就消失了.
这就是我的意思:
gen = iter([1,2,3])
next_value = gen.next() # okay, I looked forward and see that next_value = 1
# but now:
list(gen) # is [2, 3] -- the first value is gone!
Run Code Online (Sandbox Code Playgroud)
这是一个更实际的例子:
gen = element_generator()
if gen.next_value() == 'STOP':
quit_application()
else:
process(gen.next())
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我写一个发电机,你可以看一个元素前进吗?
我正在学习Java 8 lambda表达式的过程,并且想问一下peek
我遇到的与函数接口中的方法有关的以下Java代码.
在IDE上执行程序时,它不提供输出.我原以为它会给2, 4, 6
.
import java.util.Arrays;
import java.util.List;
public class Test_Q3 {
public Test_Q3() {
}
public static void main(String[] args) {
List<Integer> values = Arrays.asList(1, 2, 3);
values.stream()
.map(n -> n * 2)
.peek(System.out::print)
.count();
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个阻塞队列的对象.
我想写一个阻塞的线程,直到队列中有一个对象.与BlockingQueue.take()提供的功能类似.
但是,由于我不知道我是否能够成功处理对象,我想只是peek()而不是删除对象.我想删除该对象只有我能够成功处理它.
所以,我想要一个阻塞的peek()函数.目前,peek()只是在队列为空时根据javadoc返回.
我错过了什么吗?还有其他方法可以实现此功能吗?
编辑:
如果我只是使用了一个线程安全队列并且偷看和睡觉了?
public void run() {
while (!exit) {
while (queue.size() != 0) {
Object o = queue.peek();
if (o != null) {
if (consume(o) == true) {
queue.remove();
} else {
Thread.sleep(10000); //need to backoff (60s) and try again
}
}
}
Thread.sleep(1000); //wait 1s for object on queue
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我只有一个消费者线程和一个(单独的)生产者线程.我想这不如使用BlockingQueue有效......任何评论都赞赏.
在heapq堆中创建的python堆中偷看的官方方式是什么?现在我有
def heappeak(heap):
smallest = heappop(heap)
heappush(heap, smallest)
return smallest
Run Code Online (Sandbox Code Playgroud)
可以说,不是很好.我可以一直认为这heap[0]
是堆的顶部并使用它吗?或者这会假设太多的底层实现?
我知道bufio包中golang的特定功能.
func (b *Reader) Peek(n int) ([]byte, error)
Run Code Online (Sandbox Code Playgroud)
Peek返回接下来的n个字节而不推进读者.字节在下次读取调用时停止有效.如果Peek返回少于n个字节,它也会返回一个错误,解释为什么读取很短.如果n大于b的缓冲区大小,则错误为ErrBufferFull.
我需要能够从读取器读取特定数量的字节,这将推动读者.基本上,与上面的功能相同,但它推动了读者.有人知道怎么做到这一点吗?
我知道在C++中,您可以使用以下方式查看下一个字符:in.peek();
.
当我试图"查看"C中文件的下一个字符时,我该怎么做呢?
我们知道stdin
默认情况下是缓冲输入; 证据就是使用"保留数据"的任何机制stdin
,例如scanf()
:
int main()
{
char c[10] = {'\0'};
scanf("%9s", c);
printf("%s, and left is: %d\n", c, getchar());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
./a.out
你好,
你好,左边是10
10
当然是换行...
我一直很好奇,有没有办法"偷看" stdin
缓冲区而不删除那里可能存在的东西?
编辑
一个更好的例子可能是:
scanf("%9[^.]", c);
Run Code Online (Sandbox Code Playgroud)
输入"at.ct"后,现在我还有"data"(ct\n
)stdin
,而不仅仅是换行符.
有没有办法检查BufferedReader
对象中是否有东西要读?像C++这样的东西cin.peek()
.谢谢.
目前,NetworkStream.Peek
C#中没有一种方法.实现这样一个方法的最佳方法是什么,NetworkStream.ReadByte
除了返回byte
的实际上没有从Stream
?