代码之家  ›  专栏  ›  技术社区  ›  Ousmane D.

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

  •  9
  • Ousmane D.  · 技术社区  · 8 年前

    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());
    

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

    我试图找到一个问题的答案,但似乎找不到类似的方法 C# 流#Peek

    3 回复  |  直到 8 年前
        1
  •  6
  •   Sergey Berezovskiy    8 年前

    没有等效的 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;
           }
        }
    }
    
        2
  •  5
  •   Matt Johnson-Pint    8 年前

    你可以使用 Select 用一个 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(...);
    
        3
  •  1
  •   budi TheMrP    8 年前

    编辑:编辑原始问题后,此答案已过时。最初的问题措辞的意图是 peek -ing所有 filter findFirst

    List<Integer> integerList = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
    Optional<Integer> result = integerList.stream()
                                          .filter(i -> i % 2 ==0== 0)
                                          .peek(System.out::println)
                                          .findFirst();
    

    据我所知,没有内置的LINQ解决方案可以做到这一点,所以这里有一个扩展方法:

    public static IEnumerable<T> Peek<T>(this IEnumerable<T> source, Action<T> action)
    {
        using (var iterator = source.GetEnumerator())
        {
            while (iterator.MoveNext())
            {
                action(iterator.Current);
            }
        }
    
        using (var iterator = source.GetEnumerator())
        {
            while (iterator.MoveNext())
            {
                yield return iterator.Current;
            }
        }
    }
    

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

    输出:

    2
    4
    6
    8
    10
    2