Java与c#的一些细节区别

实习中用的语言是c#,第一次接触到这种语言,然后写的过程中,发觉和Java几乎一摸一样,好像根本是无缝切换,但细节仍有很大的区别,称有空总结一波里面的部分细节实现。

ps. 我写c#过程中,发觉c#有很多优秀的特性,写起来在方便很多,比如lambda,linq等

1.Lambda VS Delegate

Java底层实现:

1 1 /** 2 2 * @Auther: Chang 3 3 * @Date: 2018/9/2 4 4 */ 5 5 public class JavaVsCSharp { 6 6 public static void main(String[] args) { 7 7 8 8 testLambda(() -> System.out.println("Hello World")); 9 9 } 1010 1111 private static void testLambda(Print pt) { 1212 pt.print(); 1313 } 1414 } 1515 1616 @FunctionalInterface 1717 interface Print { 1818 void print(); 1919 }

结果是打印出Hello World

我们对class文件进行反编译试一下,javap -c -p JavaVsCSharp.class

内部动态生成了一个私有的静态方法

11 private static void lambda$main$0() { 22 // 空 33 }

然后然后。。。。我就不会调试了。。。。。。网上的调试我没看懂,怎么跑来跑去的(菜是一种罪过)

不过最后最后就生成了一个内部类,和一个内部方法

1 1 private static void lambda$main$0() { 2 2 System.out.println("Hello World!!!"); 3 3 } 4 4 5 5 static final class JavaVsCSharp$$Lambda$1 implements Print { 6 6 private JavaVsCSharp$$Lambda$1() { 7 7 } 8 8 9 9 @Override 1010 public void print() { 1111 lambda$main$0(); 1212 } 1313 }

c#底层实现:

转自:你知道C#中的Lambda表达式的演化过程吗?

说白了,c#就是一个delegate委托,类似于c中的函数指针。每一个Lambda对应着一个函数方法,delegate指向这个函数方法,现在Lambda把它简化了,即不用重新写一遍了。 

2.Linq VS Stream表达式

Java Stream实现:

1 1 ** 2 2 * @Auther: Chang 3 3 * @Date: 2018/9/2 4 4 */ 5 5 public class JavaVsCSharp { 6 6 public static void main(String[] args) { 7 7 8 8 List<Integer> list = new ArrayList<>(); 9 9 for (int i = 0; i < 10; i++) { 1010 list.add(new Random().nextInt(100)); 1111 } 1212 print(list, "原数据"); 1313 list = list.stream().sorted(Comparator.naturalOrder()).distinct() 1414 .filter(x -> x > 50 || x % 5 == 0).collect(Collectors.toList()); 1515 print(list, "处理后数据"); 1616 } 1717 1818 private static void print(List<Integer> list, String s) { 1919 System.out.print(s + ": "); 2020 list.forEach(x -> System.out.print(x + " ")); 2121 System.out.println(); 2222 } 2323 }

我们可以看到list得到stream流接口以后,就有很多方法可以调用了

Stream这个接口的实现方法都在 ReferencePipeline 实现完了。(话说不知为何,感觉这个类的实现很乱,代码风格差的特别多)

c#linq实现:

1 1 class IntroToLINQ 2 2 { 3 3 static void Main() 4 4 { 5 5 // The Three Parts of a LINQ Query: 6 6 // 1. Data source. 7 7 int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 }; 8 8 9 9 // 2. Query creation. 1010 // numQuery is an IEnumerable<int> 1111 var numQuery = 1212 from num in numbers 1313 where (num % 2) == 0 1414 select num; 1515 1616 // 3. Query execution. 1717 foreach (int num in numQuery) 1818 { 1919 Console.Write("{0,1} ", num); 2020 } 2121 } 2222 }

是不是很像SQL语句,用起来也特别的清晰明了。这点可以说c#甩了Java几条街。

由于很少用Linq,我的VS也过期了,难受,官方教程了解下 => 官方Linq教程

后言:可能c#一些东西没有深入到底层,因为VS过期,并且已经很少用了。所以哪里有不对的地方,老哥们,还希望指出,谢谢

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

now扩展-go的时间工具箱

关于我golang不像C,Java这种高级语言,有丰富的语法糖供开发者很方便的调用。所以这便催生出很多的开源组件,通过使用这些第三方组件能够帮助我们在开发过程中少踩很多的坑。时间处理是所有语言都要面对的一个问题,parse根据字符串转为date类型,tostring()将date类型转为定制化的字符串。在实际使用过程中,parse

java通过JNI调用C语言写的函数,能提高运行效率吗?

C语言比Java快早就是公认的事实了。而Java可以通过JNI调用C语言写的库很多人也都知道。但通过JNI调用C语言写的函数能提高效率吗?一直以来我都认为是的。昨晚心血来潮做了个测试,本意是想看看传说中强大的C语言在速度上到底有多强大,结果让我发现了通过JNI调有C语言并不能提高效率。不知道这样的结论有没有错,先说一下我测试的过程吧:第一个测

java基础知识随身记

2018年11月12日20:51:35一、基础知识:1、JVM、JRE和JDK的区别:JVM(JavaVirtualMachine):java虚拟机,用于保证java的跨平台的特性。  java语言是跨平台,jvm不是跨平台的。JRE(JavaRuntimeEnvironment):java的运行环境,包括jvmjava的核心类

Gson序列化时@SerializedName的使用

        Gson是java中比较常见的json序列化工具,实习参与的项目由于最开始是C开发的.net项目,近两年才开始用java,但之前的很多项目仍然在使用C并且还在更新。于是牵涉到跨语言的程序通信,公司自己用thrift封装了一个服务路由实现。但两个语言有些不一样的地方挺蛋疼,比如命名规则,java喜欢首字母小写,C喜欢首字母大写,传数据就

Java中的native关键字

一. 什么是NativeMethod  简单地讲,一个NativeMethod就是一个java调用非java代码的接口。一个NativeMethod是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern"C"告知C++编译器去