像写C#一样编写java代码

简介:

        

JDK8提供了非常多的便捷用法和语法糖,其编码效率几乎接近于C#开发,maven则是java目前为止最赞的jar包管理和build工具,这两部分内容都不算多,就合并到一起了。

愿编写java代码的过程如:Fast & Furious

鸟枪换炮咯,走起!J Java 7发布于2011年,Java 8发布于2014年,Java 9还远么?

在javase8中,lambda表达式的形式基本好C#中一致,Stream和LINQ类似,Future<T>和Task<T>类似,可以这样说,javase8大体达到了C#编码的便捷程度哈!帅帅哒

  • Lambda(和.NET一样)

功能

示例

函数式接口

Arrays.sort(words, (first, second) ->

Integer.compare(first.length(), second.length()));

BiFunction<String, String, Integer> comp =

(first, second) -> Integer.compare(first.length(), second.length());

常见的函数式接口(推荐使用),和C#Action<T>,Function<T, R>类似

Runnable,Supplier<T>,Consumer<T>, Function<T, R>, Predicate<T>

方法引用

Arrays.sort(words, String::compareToIgnoreCase);

构造器引用

list.stream().collect(Collectors.toList());

默认方法,接口中的静态方法

不太推荐

概念

所有的lambda表达式都符合闭包,且是延迟执行的

  • Stream

功能

示例

创建Stream

Stream<String> song = Stream.of("Shanghai", "Beijing");

filter,map,flatmap方法

分别对应C#中Linq的where,select和selectMany

常见操作

去除重复: .distince()

排序.sorted(), 反向.reversed()

聚合方法 .max(), findFirst(), .findAny(), .anyMatch()

聚合操作 .reduce((x,y)->x+y)

分组和分片: .groupingBy(), mapping(), joining()

并行流: .parallel()

Optional类型

Optional<T>是对T类型封装,它不会返回null,使得引用更安全

  • 时间日期

在1.8以前,主要使用joda-time库来处理一些比较复杂的时间日期操作,现在有官方的api了。

功能

示例

时间线Instant

Instant start = Instant.now();

Thread.sleep(1000);

Instant end = Instant.now();

Duration timeElapsed = Duration.between(start, end);

long millis = timeElapsed.toMillis();

本地日期LocalDate

LocalDate today = LocalDate.now();

LocalDate oneDay = LocalDate.of(2017, 7, 9);

LocalDate addDay = LocalDate.now().plusDays(10);

日期校正器TemporalAdjueters

获取2017年5月的第一个周二

LocalDate time = LocalDate.of(2017, 5, 1)

.with(TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY));

本地时间LocalTime

LocalTime time = LocalTime.of(16, 37, 11);

带时区的时间ZonedDateTime

ZonedDateTime applloTime = ZonedDateTime.of(2017, 5, 9, 16, 40, 11, 0, ZoneId.of("America/New_York"));

格式化和解析DateTimeFormatter

用于替代过去的DateFormat,SimpleDateFormat

遗留代码的互操作

Instant start = Instant.now();其他类型的操作类似

Date oldDate = Date.from(start);

  • 并发

功能

示例

原子值

AtomicLong nextNumber = new AtomicLong();

nextNumber.incrementAndGet();

ConcurrentHashMap的改进

ConcurrentMap<String, Integer> map = new ConcurrentHashMap();

map.putIfAbsent("age", 100);

map.compute("name", (k, v) -> v == null ? 1 : v + 1);

map.merge("age", 1, (oldValue, newValue) -> oldValue + newValue);

批量数据操作:reduceValue, reduceKeys

并行数组操作

String[] people = new String[]{"xionger", "shuaishuaida"};

Arrays.parallelSort(people);

Future,和.NET的Task<T>类似

CompletableFuture<String> contents =

CompletableFuture.supplyAsync(() -> getAsync());

这部分知识之后再加强

  • 杂项

功能

示例

字符串

String joined = String.join("/", "user", "local", "bin");

数字扩展

Long testValue = Integer.toUnsignedLong(Integer.MAX_VALUE);

新的数值函数

int result = Math.floorMod(Math.toIntExact(100L), 3);

新增集合方法

list.forEach((item) -> System.out.println(item));

Map: remove, putIfAbsent, computeIf, merge

排序:Arrays.sort(people, Comparator.comparing(Person::getAge));

使用文件

这儿看到try-with-resource,等价于using,java代码也可以和.net一样简介

try (Stream<String> lines = Files.lines(path)) {

    Optional<String> pwd = lines.filter(s -> s.contains("pwd")).findFirst();}

Base64编码

Base64.Encoder encoder = Base64.getMimeEncoder();

try (OutputStream output = Files.newOutputStream(encoderPath)) {

    Files.copy(originalPath, encoder.wrap(output));}

注解

通过在注解上添加@Repeatable,使得注解可多次使用

可以使用基于类型的注解

private @NonNull List<String> names = new ArrayList<>();

方法参数反射,可以反射获取参数的名称

Java7

使用Path接口来代替File类

Path absolute = Paths.get("/", "home", "shanghai ");

Files.write(absolute, content.getBytes(StandardCharsets.UTF_8));

Tip: demo项目

 

Maven使用起来相对比较简单,其配置均写在setting.xml中,主要的配置项包括镜像的选择和本地仓库的选择,如下所示。

 View Code

其他常见的包括Eclipse中maven的配置,这部分只需要指定好Installations和UserSetting就好。

Maven编译的常见命令如下所示

命令 诠释
mvn package 生成target目录,编译、测试代码,生成测试报告,生成jar/war文件 
mvn tomcat:run 运行项目于tomcat[jetty等server也OK]上
mvn compile  编译
mvn test   编译并测试
mvn clean 清空生成的文件 
mvn install -X 想要查看完整的依赖踪迹,包含那些因为冲突或者其它原因而被拒绝引入的构件,打开 Maven 的调试标记运行 
Maven的Scope
compile 编译范围,默认的范围
provided 已提供范围,比如有些web相关jar,tomcat中有,但本地没有时使用
runtime 运行时范围,比如编译时只需要slf4j-api,运行时才需要具体的实现jar
test 测试范围,例如junit,spring-test

Maven示例

 View Code

 

    

本文转自 sshpp 51CTO博客,原文链接:http://blog.51cto.com/12902932/1924096,如需转载请自行联系原作者

相关文章
|
1月前
|
C# Windows
C#通过代码实现快捷键编辑
C#通过代码实现快捷键编辑
|
3月前
|
开发框架 .NET 编译器
C# 10.0中Lambda表达式的改进:更简洁、更灵活的代码编写体验
【1月更文挑战第21天】随着C#语言的不断发展,Lambda表达式作为一种简洁、高效的函数式编程工具,在C# 10.0中迎来了重要的改进。本文将详细探讨C# 10.0中Lambda表达式的新特性,包括参数类型的推断增强、自然类型的Lambda参数以及Lambda表达式的属性改进等。这些改进不仅简化了Lambda表达式的编写过程,还提升了代码的可读性和灵活性,为开发者带来了更优质的编程体验。
|
3月前
|
C# 开发者
C# 10.0中的文件范围命名空间:简化代码组织的新方式
【1月更文挑战第18天】C# 10.0引入了文件范围的命名空间,这是一种新的语法糖,用于更简洁地组织和管理代码。文件范围命名空间允许开发者在每个文件的基础上定义命名空间,而无需显式使用花括号包裹整个文件内容。本文将深入探讨文件范围命名空间的工作原理、使用场景以及它们为C#开发者带来的便利。
|
4月前
|
存储 人工智能 C#
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
36 0
|
5月前
|
开发框架 Oracle Java
2023年10月TIOBE排行榜发布:C#逼近Java
2023年10月TIOBE排行榜发布:C#逼近Java
|
5月前
|
存储 Java C#
c#快速入门~在java基础上,知道C#和JAVA 的不同即可
c#快速入门~在java基础上,知道C#和JAVA 的不同即可
85 0
|
4月前
|
IDE C# 开发工具
C# | 多线程批量下载文件(创建N个线程同时批量下载文件,只需要几行代码而已)
批量下载文件时使用多线程可以有效缩短完成时间,本文将讲解如何使用C#+CodePlus扩展库快速完成多线程的文件下载。 大部分代码由IDE自动生成,需要我们自己编写的代码正好**10行**。也就是说,只需要10分钟,就可以手撸一个多线程的批量下载器。
86 0
C# | 多线程批量下载文件(创建N个线程同时批量下载文件,只需要几行代码而已)
|
2月前
|
数据采集 JSON 前端开发
从代码到内容:使用C#和Fizzler探索Instagram的深处
Instagram是一个流行的社交媒体平台,拥有数亿的用户和海量的图片和视频内容。如果您想要从Instagram上获取一些有用的信息或数据,您可能需要使用爬虫技术来自动化地抓取和分析网页内容。本文将介绍如何使用C#和Fizzler这两个强大的工具,来实现一个简单而高效的Instagram爬虫,从代码到内容,探索Instagram的深处。
|
3月前
|
存储 传感器 监控
工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)
工业相机如何实现实时和本地Raw格式图像和Bitmap格式图像的保存和相互转换(C#代码,UI界面版)
31 0
|
3月前
|
存储 C# 容器
掌握 C# 变量:在代码中声明、初始化和使用不同类型的综合指南
变量是用于存储数据值的容器。 在 C# 中,有不同类型的变量(用不同的关键字定义),例如: int - 存储整数(没有小数点的整数),如 123 或 -123 double - 存储浮点数,有小数点,如 19.99 或 -19.99 char - 存储单个字符,如 'a' 或 'B'。Char 值用单引号括起来 string - 存储文本,如 "Hello World"。String 值用双引号括起来 bool - 存储具有两个状态的值:true 或 false
37 2