您的位置:首页 > 编程语言 > Java开发

jdk1.7新特性

2015-04-23 19:33 197 查看
最近研究学习了jdk1.7中新增加的特性,首先需要更换jdk版本,配置环境变量,这样折腾之后,java-version发现是jdk1.7的版本,可是我用eclipse开发的时候,却总是出现语法编译出错。奇了个怪了,不管更换编译时用的jdk还是新建工程时候选择jdk1.7都是不行的,最后重新下载64位的eclipse,后来自然就ok了,看来是之前eclipse的问题。下面一一介绍jdk1.7中的新增特性:

第一:数字允许使用下划线,需要注意的是只能将下划线放置到数字之间

/**
 * 数字允许使用下划线,需要注意的是只能将下划线放置到数字之间
 */
int number = 100_00_00;
System.out.println(number);
long creditCardNumber = 1234_5678_9012_3456L;
long socialSecurityNumber = 999_99_9999L;
float pi = 	3.14_15F;
long hexBytes = 0xFF_EC_DE_5E;
long hexWords = 0xCAFE_BABE;
long maxLong = 0x7fff_ffff_ffff_ffffL;
byte nybbles = 0b0010_0101;
long bytes = 0b11010010_01101001_10010100_10010010;
第二:直接支持:二进制,八进制,十六进制表示

/**
 * 二进制,八进制,十六进制表示
 */
int binaryNumber = 0b011;//这里表示2进制
System.out.println(binaryNumber);
int eightNumber = 022;//这里表示8进制,转换成十进制是18
System.out.println(eightNumber);
int sixTeenNumber = 0x14;//这里表示16进制,转换成十进制是20
System.out.println(sixTeenNumber);
第三:ThreadLocalRandom并发生成随机数,线程安全

ThreadLocalRandom localRandom = ThreadLocalRandom.current();
  localRandom.nextDouble();
第四:switch语句允许使用字符串

/**
* switch语句允许使用字符串
 */
String name = "xiaoming";
switch (name) {
<span style="white-space:pre">	</span>case "xiaohong":
	     <span style="white-space:pre">	</span>System.out.println("your name is :"+name);
	<span style="white-space:pre">	</span>break;
	case "xiaoming":
		System.out.println("your name is :"+name);
		break;
	default:
		break;
}
第五:泛型实例化类型自动推断

/**
* 泛型实例化类型自动推断
* Map<String, List<String>> myMap = new HashMap<String, List<String>>();
*/
List<String>list = new ArrayList<>();
Map<String,List<String>>map = new HashMap<>();
第六:Jdk7允许捕获多个异常,注意此时cath中的参数ex是final类型的

/**
 * Jdk7允许捕获多个异常,注意此时cath中的参数ex是final类型的
 */
File file = new File("/local/jdk7/");
try {
	Reader reader = new InputStreamReader(new FileInputStream(file));
	reader.read();
} catch (NullPointerException | IOException ex) {
	ex.printStackTrace();
}


第六:try-with-resources,可以自动关闭相关的资源

/**
 * try-with-resources,可以自动关闭相关的资源
 * (该资源实现了AutoCloseable接口,jdk7为绝大部分资源对象都实现了这个接口)
 * @throws FileNotFoundException 
 */
public String readLine(String filePath) throws IOException {
	try (BufferedReader reader = new BufferedReader(new FileReader(new File(filePath)))) {
		return reader.readLine();
	}
}
第七:WatchService监听文件系统的改变,这里我写了一个方法,传入磁盘下的一个路径,即可监听该路径下文件的改变,删除等。

/**
 * WatchService监听文件系统的改变
 */
public static void testWatchService(Path watchPath) {
	try {
		WatchService watchService = FileSystems.getDefault().newWatchService();
		watchPath.register(watchService,StandardWatchEventKinds.ENTRY_CREATE,
				StandardWatchEventKinds.ENTRY_DELETE,
				StandardWatchEventKinds.ENTRY_MODIFY);

		while(true){  
			WatchKey key = watchService.take();  
			for(WatchEvent<?> event : key.pollEvents()){  
				WatchEvent.Kind kind = event.kind();  

				if(kind == StandardWatchEventKinds.OVERFLOW){//事件可能lost or discarded  
					continue;  
				}  

				WatchEvent<Path> e = (WatchEvent<Path>)event;  
				Path fileName = e.context();  

				System.out.printf("Event %s has happened,which fileName is %s%n"  
						,kind.name(),fileName);  
			}  
			if(!key.reset()){  
				break;  
			}  
		}  

	} catch (IOException | InterruptedException e) {
		e.printStackTrace();
	}
}
然后再main方法中这样调用:

testWatchService(Paths.get("d:","haha"));

这里我是监听的d:/haha这个文件夹中内容的变化,如下图:



第八:FileVisitor递归调用文件夹:

/**
 * 递归调用文件夹
 */
public static void diGuiDirectory(Path directPath) {
	try {
		Files.walkFileTree(directPath,new FileVisitor<Path>() {

			public void find(Path path) {
				System.out.printf("访问-%s:%s%n",(Files.isDirectory(path)?"目录":"文件"),path.getFileName());
			}

			@Override
			public FileVisitResult preVisitDirectory(Path dir,
				<span style="white-space:pre">	</span>BasicFileAttributes attrs) throws IOException {
				// TODO Auto-generated method stub
				return FileVisitResult.CONTINUE;
			}

			@Override
			public FileVisitResult visitFile(Path file,
					BasicFileAttributes attrs) throws IOException {
				// TODO Auto-generated method stub
				find(file);
				return FileVisitResult.CONTINUE;
			}

			@Override
			public FileVisitResult visitFileFailed(Path file,
					IOException exc) throws IOException {
				// TODO Auto-generated method stub
				System.out.println("error:"+exc);  
				return FileVisitResult.CONTINUE;
			}

			@Override
			public FileVisitResult postVisitDirectory(Path dir,
					IOException exc) throws IOException {
				// TODO Auto-generated method stub
				find(dir);
				return FileVisitResult.CONTINUE;
			}
		});
	} catch (IOException e) {
		e.printStackTrace();
	}
}
这里我查询刚才新建的haha文件夹下的文件diGuiDirectory(Paths.get("d:","haha"));

此时,控制台打印如下语句:

访问-文件:test.txt

访问-目录:sdf

访问-文件:test.txt

访问-目录:haha

另外在网上还看到诸如下面这些新特性,这些特性,我不能判断其是否是正确的,反正在我的jdk1.7版本上测试时不成立的。不知道有没有人和我遇到同样的问题,最后又是怎么决绝的。

新增一些取环境信息的工具方法

File System.getJavaIoTempDir() // IO临时文件夹

File System.getJavaHomeDir() // JRE的安装目录

File System.getUserHomeDir() // 当前用户目录

File System.getUserDir() // 启动java进程时所在的目录5

Boolean类型反转,空指针安全,参与位运算

Boolean Booleans.negate(Boolean booleanObj)

True => False , False => True, Null => Null

boolean Booleans.and(boolean[] array)

boolean Booleans.or(boolean[] array)

boolean Booleans.xor(boolean[] array)

boolean Booleans.and(Boolean[] array)

boolean Booleans.or(Boolean[] array)

boolean Booleans.xor(Boolean[] array)

安全的加减乘除

int Math.safeToInt(long value)

int Math.safeNegate(int value)

long Math.safeSubtract(long value1, int value2)

long Math.safeSubtract(long value1, long value2)

int Math.safeMultiply(int value1, int value2)

long Math.safeMultiply(long value1, int value2)

long Math.safeMultiply(long value1, long value2)

long Math.safeNegate(long value)

int Math.safeAdd(int value1, int value2)

long Math.safeAdd(long value1, int value2)

long Math.safeAdd(long value1, long value2)

int Math.safeSubtract(int value1, int value2)

语法上支持集合,而不一定是数组

Java代码:

final List<Integer> piDigits = [ 1,2,3,4,5,8 ];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: