Linq C#中Java的Stream#Peek方法的等价物是什么?

Ous*_* D. 8 c# java linq java-8 java-stream

我已经习惯了使用Java的Stream#Peek方法,因为它是调试中间流操作的有用方法.对于那些不熟悉该Stream#Peek方法的人,下面显示了它的定义:

Stream<T> peek(Consumer<? super T> action)

返回由此流的元素组成的流,此外还在从结果流中消耗元素时对每个元素执行提供的操作.这是一个中间操作.

考虑下面这个简单的例子:

List<Integer> integerList = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
List<Integer> result = integerList.stream()
                                  .filter(i -> i % 2 == 0)
                                  .peek(System.out::println)
                                  .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

使用这种Stream#Peek方法,这应该基本上允许我将所有偶数打印到控制台,以便我可以测试,看看这是否是我所期望的.

我试图找到手头问题的答案,但似乎无法找到类似的方法C#,是否有人知道Java Stream#Peek或其他类似行为的方法?

Ser*_*kiy 6

Peek在LINQ中没有等价物- 即没有方法执行某些操作返回源元素.类中有一个ForEach方法List对每个元素执行操作,但它不返回源元素,并且如前所述,它不是IEnumerable扩展.

但是你可以轻松编写自己的扩展

public static IEnumerable<T> Peek<T>(this IEnumerable<T> source, Action<T> action)
{
    if (source == null) throw new ArgumentNullException(nameof(source));
    if (action == null) throw new ArgumentNullException(nameof(action));

    return Iterator();

    IEnumerable<T> Iterator() // C# 7 Local Function
    {
       foreach(var item in source)
       {
           action(item);
           yield return item;
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @MattJohnson以及参数检查如何与延迟执行一起使用? (2认同)
  • 等等 - 不,我错了......使用本地函数,参数检查会提前发生.如果没有它,就会在枚举时发生......你是对的,我学到了一些东西!:) (2认同)
  • @MattJohnson是的,这就是LINQ方法在框架中实现的方式,但当然没有本地函数 - 每个迭代器只有私有方法 (2认同)

Mat*_*int 5

为此,您可以将 aSelectStatement Lambda一起使用。考虑:

var integerList = new List<int> {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
var result = integerList
    .Where(i => i % 2 == 0)

    // this select uses a statement lambda
    .Select(i =>
    {
        Console.WriteLine(i);
        return i;
    })

    .Whatever(...);
Run Code Online (Sandbox Code Playgroud)