Java与c#的一些细节区别
实习中用的语言是c#,第一次接触到这种语言,然后写的过程中,发觉和Java几乎一摸一样,好像根本是无缝切换,但细节仍有很大的区别,称有空总结一波里面的部分细节实现。
ps. 我写c#过程中,发觉c#有很多优秀的特性,写起来在方便很多,比如lambda,linq等
1.Lambda VS Delegate
Java底层实现:
/**
* @Auther: Chang
* @Date: 2018/9/2
*/
public class JavaVsCSharp {
public static void main(String[] args) { testLambda(() -> System.out.println("Hello World"));
} private static void testLambda(Print pt) {
pt.print();
}
} @FunctionalInterface
interface Print {
void print();
}
结果是打印出Hello World
我们对class文件进行反编译试一下,javap -c -p JavaVsCSharp.class
内部动态生成了一个私有的静态方法
private static void lambda$main$0() {
// 空
}
然后然后。。。。我就不会调试了。。。。。。网上的调试我没看懂,怎么跑来跑去的(菜是一种罪过)
不过最后最后就生成了一个内部类,和一个内部方法
private static void lambda$main$0() {
System.out.println("Hello World!!!");
} static final class JavaVsCSharp$$Lambda$1 implements Print {
private JavaVsCSharp$$Lambda$1() {
} @Override
public void print() {
lambda$main$0();
}
}
c#底层实现:
说白了,c#就是一个delegate委托,类似于c中的函数指针。每一个Lambda对应着一个函数方法,delegate指向这个函数方法,现在Lambda把它简化了,即不用重新写一遍了。
2.Linq VS Stream表达式
Java Stream实现:
**
* @Auther: Chang
* @Date: 2018/9/2
*/
public class JavaVsCSharp {
public static void main(String[] args) { List<Integer> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(new Random().nextInt(100));
}
print(list, "原数据");
list = list.stream().sorted(Comparator.naturalOrder()).distinct()
.filter(x -> x > 50 || x % 5 == 0).collect(Collectors.toList());
print(list, "处理后数据");
} private static void print(List<Integer> list, String s) {
System.out.print(s + ": ");
list.forEach(x -> System.out.print(x + " "));
System.out.println();
}
}
我们可以看到list得到stream流接口以后,就有很多方法可以调用了
Stream这个接口的实现方法都在 ReferencePipeline 实现完了。(话说不知为何,感觉这个类的实现很乱,代码风格差的特别多)
c#linq实现:
class IntroToLINQ
{
static void Main()
{
// The Three Parts of a LINQ Query:
// 1. Data source.
int[] numbers = new int[] { , , , , , , }; // 2. Query creation.
// numQuery is an IEnumerable<int>
var numQuery =
from num in numbers
where (num % ) ==
select num; // 3. Query execution.
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}
}
}
是不是很像SQL语句,用起来也特别的清晰明了。这点可以说c#甩了Java几条街。
由于很少用Linq,我的VS也过期了,难受,官方教程了解下 => 官方Linq教程
后言:可能c#一些东西没有深入到底层,因为VS过期,并且已经很少用了。所以哪里有不对的地方,老哥们,还希望指出,谢谢
Java与c#的一些细节区别的更多相关文章
- java中堆和堆栈的区别
java中堆和堆栈的区别(一) 1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取 ...
- 【Java面试题系列】:Java中final finally finalize的区别
本篇为[Java面试题系列]第三篇,文中如有错误,欢迎指正. 第一篇链接:[Java面试题系列]:Java基础知识常见面试题汇总 第一篇 第二篇链接:[Java面试题系列]:Java基础知识常见面试题 ...
- Java中Set Map List 的区别
java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...
- Java中Comparable和Comparator接口区别分析
Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...
- 转:Java中abstract和interface的区别
转自:Java中abstract和interface的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java ...
- Java abstract class 和 interface 的区别
Java abstract class 和 interface 的区别 1. abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制 2. 以Door的抽象概 ...
- java虚拟机和Dalvik虚拟机的区别
java虚拟机和Dalvik虚拟机的区别: java虚拟机Dalvik虚拟机 java虚拟机基于栈. 基于栈的机器必须使用指令来载入和操作栈上数据,所需指令更多更多dalvik虚拟机是基于寄存器的 j ...
- Java中this与super的区别【6】
若有不正之处,请多多谅解并欢迎批评指正,不甚感激.请尊重作者劳动成果: 本文原创作者:pipi-changing本文原创出处:http://www.cnblogs.com/pipi-changing/ ...
- java 字节流和字符流的区别 转载
转载自:http://blog.csdn.net/cynhafa/article/details/6882061 java 字节流和字符流的区别 字节流与和字符流的使用非常相似,两者除了操作代码上的不 ...
随机推荐
- zeromq学习记录(四)使用ZMQ_ROUTER ZMQ_DEALER
/************************************************************** 技术博客 http://www.cnblogs.com/itdef/ ...
- 为docker配置HTTP代理服务器
背景: node1不能访问外网, node2可以访问外网,node1通过node2的代理服务来访问外网. 1. node1不能访问外网 vim /etc/resolv.conf 注释掉DNS配置文件 ...
- python datetime模块用法
1. 创建naive(无时区信息)的datetime对象 import datetime dt_utc = datetime.datetime.utcnow() dt_utc # datetime.d ...
- ScheduledExecutorService--目前最理想的定时任务实现方式
ScheduledExecutorService 理想的定时任务实现方式 : 通过线程池的方式来执行任务的 可以灵活的设定第一次执行任务延迟时间 提供了良好的约定,以便设定定时执行的间隔时间代码实现: ...
- OpenSessionViewFilter
OpenSessionViewFilter是spring提供的一个针对hibernate的一个支持类,其主要的意思是=在发起一个页面请求的时候打开session,并且保持session直到请求结束,具 ...
- Vue post提交
vue中的axios 是不直接支持post方法的,所以我们得绕一下路,我目前在登录的时候运用到了,服务器端用php,可以收到数据 let param = new URLSearchParams(); ...
- JavaScript:void(0)使用介绍
1.点击链接后不做任何事情(为防止点击链接后跳转到页首,onclick事件return false即可) <a href="javascript:void(0);" > ...
- php memcache 基础操作
<?php/** * Memcache缓存操作 * @author hxm * @version 1.0 * @since 2015.05.04 */class MCache extends O ...
- linux 系统管理学习
Linux系统管理一.进程管理1.进程管理的作用1)判断服务器健康状态2)查看系统中所有进程3)杀死进程2.进程的查看1)查看所有进程ps aux 查看系统中所有进程ps -le 查看系统中所有进程- ...
- [solution] JZOJ3493 三角形
[solution] JZOJ3493 三角形 Description 平面上有n个点,求出用这些点可以构成的三角形数. Input 第一行一个整数n. 接下来n行,每行两个整数,表示点的坐标. Ou ...