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或其他类似行为的方法?
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)
为此,您可以将 aSelect与Statement 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)
| 归档时间: |
|
| 查看次数: |
1203 次 |
| 最近记录: |