C#相当于Java 8"方法参考"

Gor*_*son 24 c# java java-8

我最近有机会调整一些Java代码,并能够利用一些新的Java 8功能.在一个特定情况下,我需要.Name从对象列表中获取(字符串)属性列表.我所做的一个简单例子是:

// sample data: <Thing> objects have a single String property called "Name" 
List<Thing> thingList =
    new ArrayList<>(Arrays.asList(new Thing("Thing1"), new Thing("Thing2")));

// first pass
List<String> nameList = new ArrayList<>();
thingList.forEach(x -> nameList.add(x.getName()));

// refinement 1: use stream, map, and collect
List<String> nameList1 =
    thingList.stream().map(x -> x.getName()).collect(Collectors.toList());

// refinement 2: use "Thing::getName" method reference
List<String> nameList2 =
    thingList.stream().map(Thing::getName).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我很想知道这些方法将如何转化为C#,我得到了

// sample data: <Thing> objects have a single String property called "Name"
var thingList = new List<Thing> { new Thing("Thing1"), new Thing("Thing2") };

// first pass
var nameList = new List<String>();
thingList.ForEach(x => nameList.Add(x.Name));

// refinement 1: use Select and ToList
List<String> nameList1 = thingList.Select(x => x.Name).ToList();
Run Code Online (Sandbox Code Playgroud)

我还没有找到(还有?)是C#等价的"精炼2",用一些(一点点)更简洁的方式取代Lambda表达式.在这种情况下,是否存在与Java 8"方法引用"等效的C#,因为我正在尝试获取每个对象的属性(在Java中使用getProperty 方法完成)?

Blo*_*ard 9

你必须在Thing(或静态Thing方法)之外声明一个方法,然后你可以传递一个方法组引用:

private string GetName(Thing thing)
{
    return thing.Name;
}

...

List<String> nameList1 = thingList.Select(GetName).ToList();
Run Code Online (Sandbox Code Playgroud)

在C#6中,您还可以使用表达式函数来保存几行:

private string GetName(Thing thing) => thing.Name;
Run Code Online (Sandbox Code Playgroud)

  • @Danny Chen:"基本上"Java 8的方法引用也是一个调用指定方法的lambda表达式的语法糖.虽然从技术上讲,它是另一种方式,但lambda表达式是一种语法糖,用于方法引用另一种方法来保持lambda的体. (7认同)

小智 5

c#有一个等价的,这个特性是callind Method Group

查看更多:

C#中的方法组是什么?

样本:

private static int[] ParseInt(string s)
{
    var t = ParseString(s);
    var i = t.Select(x => int.Parse(x));
    return i.ToArray();
}
Run Code Online (Sandbox Code Playgroud)

与方法组:

private static int[] ParseInt(string s)
{
    var t = ParseString(s);
    var i = t.Select(int.Parse);
    return i.ToArray();
}
Run Code Online (Sandbox Code Playgroud)