一、异常处理
public class ExcepTest {
// todo Guava异常处理样例
// @Test
// public void t3() throws IOException,SQLException{
// Lists.newArrayList(RandomUtil.randomLong(20))
// try {
// // todo 可控的异常处理
// someMethodThatCouldThrowAnything();
// } catch (IKnowWhatToDoWithThisException e) {
// handle(e);
// } catch (Throwable t) {
Throwables.throwIfInstanceOf(t, IOException.class);
Throwables.throwIfInstanceOf(t, SQLException.class);
throw new RuntimeException(t); // throw t;{}
// }
// }
@Test
public void t1() {
int a = 2019;
int b = 0;
try {
final int i = a / b;
}catch (ArithmeticException e){
throw new ServiceException("分母不能是0啊");
}
catch (Throwable t) {
final String s = Throwables.getStackTraceAsString(t);
if (s.contains("by zero")) {
throw new ServiceException("分母不能是0");
}
}
}
// todo IO流异常处理
@Test
public void test2() {
// 输入和输出都使用缓冲流
try {
FileInputStream in = new FileInputStream("D:\\temp\\a.txt");
BufferedInputStream inBuffer = new BufferedInputStream(in);
FileOutputStream out = new FileOutputStream("D:\\temp\\a_copy.txt");
BufferedOutputStream outBuffer = new BufferedOutputStream(out);
int len = 0;
byte[] bs = new byte[1024];
long begin = System.currentTimeMillis();
while ((len = inBuffer.read(bs)) != -1) {
outBuffer.write(bs, 0, len);
}
System.out.println("复制文件所需的时间:" + (System.currentTimeMillis() - begin)); // 平均时间约 200 多毫秒
inBuffer.close();
in.close();
outBuffer.close();
out.close();
} catch (FileNotFoundException f) {
throw new ServiceException("文件未找到!");
} catch (Throwable t) {
t.printStackTrace();
}
}
@Test
public void t4() {
final ArrayList<Integer> list = Lists.newArrayList(1, 2, 3, 3, 3, 5, 46, 4, 7, 8, 7);
Integer integer = null;
try {
integer = list.get(2);
final int i = integer / 0;
} catch (Throwable e) {
Throwables.throwIfInstanceOf(e,NullPointerException.class);
Throwables.throwIfInstanceOf(e,IndexOutOfBoundsException.class);
}
System.out.println(integer);
}
@Test
public void t5(){
String a = "2019-06-16 12:16:49";
LocalDateTime time = null;
try {
time = LocalDateTime.parse(a);
} catch (DateTimeParseException e){
throw new ServiceException("时间转换异常");
}catch (Throwable t) {
Throwables.throwIfInstanceOf(t, DateTimeParseException.class);
}
System.out.println(time);
}
}
二、IO读写操作
public class File_test {
// todo Guava IO读写操作
@Test
public void t1(){
String fileName = "d://temp//a.txt";
String contents = "ssssssdsd test esdf eesv";
demoFileWrite(fileName,contents);
}
@Test
public void t2() throws IOException {
String testFilePath = "d://temp//a.txt";
File testFile = new File(testFilePath);
List<String> lines = Files.readLines(testFile, Charsets.UTF_8);
for (String line : lines) {
System.out.println(line);
}
}
public void demoFileWrite(final String fileName, final String contents)
{
final File newFile = new File(fileName);
try
{
Files.write(contents.getBytes(), newFile);
}
catch (IOException fileIoEx)
{
System.err.println( "ERROR trying to write to file '" + fileName + "' - "
+ fileIoEx.toString());
}
}
}
三、参数校验和Object的toString重写
@Data
class St1 {
private String name;
private Integer age;
private String city;
}
@Data
class St2 {
private String name;
private Integer age;
private String city;
@Override
public String toString() {
return "St2{" +
"name='" + name + '\'' +
", age=" + age +
", city='" + city + '\'' +
'}';
}
}
@Data
class St3 {
private String name;
private Integer age;
private String city;
// todo guava,重写对象的toString方法,为空时忽略
@Override
public String toString() {
return MoreObjects.toStringHelper(this.getClass())
.add("city", city)
.add("name", name)
.add("age", age)
.omitNullValues().toString();
}
}
public class TestObjetcs {
@Test
public void t1() {
System.out.println("st1 = " + new St1());
System.out.println("st2 = " + new St2());
final St3 st3 = new St3();
st3.setAge(12);
System.out.println("st3 = " + st3);
}
@Test
public void t2() {
final St3 st3 = new St3();
st3.setName("zhp");
st3.setCity("bj");
st3.setAge(19);
f1(st3);
}
// todo guava 参数校验
public void f1(St3 st3) {
Preconditions.checkNotNull(st3.getName(), "name may not be null");
Preconditions.checkArgument(st3.getAge() >= 18 && st3.getAge() < 99, "age must in range (18,99)");
Preconditions.checkArgument(st3.getCity() != null && st3.getCity().length() < 10, "desc too long, max length is ", 10);
}
}
四、Optional空指针
public class Optional_ {
@Test
public void t1(){
// 初始化 List
List<String> myList = new ArrayList<>();
myList.add("Geeks");
myList.add("for");
myList.add("GeeksClasses");
myList.add(null);
myList.add("GeeksforGeeks");
myList.add("");
myList.add("Data Structures");
displayValuesUsingJavaNulls(myList); // 基础手写方法判断是否为空代码
displayValuesUsingGuavaOptional(myList); // 调用 guava Optional封装方法实现
}
// Method to display values using Java Nulls
private static void displayValuesUsingJavaNulls(List<String> myList) {
System.out.println("Displaying values using Java Nulls");
// For every String in myList
for (String str : myList) {
if (str == null || str.isEmpty()) {
System.out.println("String : Value is empty or not available");
}
else {
System.out.println("String : " + str);
}
}
System.out.println();
}
// Method to display values using Guava Optional
private static void displayValuesUsingGuavaOptional(List<String> myList) {
System.out.println("Displaying values using Guava Optional");
for (String str : myList) {
Optional<String> optionalName = Optional.ofNullable(emptyToNull(str));
System.out.println("String : " + optionalName.orElse("String : Value is empty or not available"));
}
}
}
五、table,二维矩阵的数据结构,可存放比较复杂的结构数据
5.1 demo1
// todo 这是一个二维表的数据结构,一个二维矩阵
// Table是Guava提供的一个接口 Interface Table(R,C,V),由rowKey(行)+columnKey(列)+value组成
// 适用于多个健做索引的场景
public class Table_ {
@Test
public void t1(){
Table<String, String, String> studentTable = HashBasedTable.create();
studentTable.put("CSE", "5", "Dhiman");
studentTable.put("CSE", "7", "Shubham");
studentTable.put("CSE", "9", "Abhishek");
studentTable.put("CSE", "12", "Sahil");
studentTable.put("ECE", "15", "Ram");
studentTable.put("ECE", "12", "Lube");
studentTable.put("ECE", "18", "Anmol");
studentTable.put("ECE", "20", "Akhil");
studentTable.put("ECE", "25", "Amrit");
Map<String, String> eceMap = studentTable.row("ECE");
System.out.println("List of ECE students : ");
for (Map.Entry<String, String> student : eceMap.entrySet()) {
System.out.println("Student Roll No : " + student.getKey() + ", Student Name : " + student.getValue());
}
System.out.println();
Map<String, String> stuMap = studentTable.column("12");
for (Map.Entry<String, String> student : stuMap.entrySet()) {
System.out.println("Student Roll No : " + student.getKey() + ", Student Name : " + student.getValue());
}
}
}
5.2 demo2
六、增强集合操作
6.1 Multiset
public class Multiset_test {
// todo Multiset对象不是set,是一个Collection,它本质上是一个Set加一个元素计数器。
@Test
public void t1(){
Multiset multiset = HashMultiset.create();
String sentences = "this is a story, there is a good girl in the story.";
Iterable<String> words = Splitter.onPattern("[^a-z]{1,}").omitEmptyStrings().trimResults().split(sentences);
for (String word : words) {
multiset.add(word);
}
final Set set = multiset.elementSet();
final Set set1 = multiset.entrySet();
for (Object element : multiset.elementSet()) {
System.out.println((String)element + ":" + multiset.count(element));
}
}
// todo 存放POJO时,可重写POJO的equals方法,除重或者统计使用
@Test
public void t2(){
Multiset multiset = HashMultiset.create();
List<A> lists = Lists.newArrayList();
for (int i = 0; i < 11; i++) {
final A a = new A().setId(i).setName("test" + i);
lists.add(a);
}
lists.add(new A().setId(2).setName("test2"));
lists.add(new A().setId(2).setName("test222"));
for (A a: lists) {
multiset.add(a);
}
final Set set1 = multiset.elementSet();
final Set set2 = multiset.entrySet();
for (Object element : multiset.elementSet()) {
System.out.println((A)element + ":" + multiset.count(element));
}
}
}
@Data
@Accessors(chain = true)
class A{
private Integer id;
private String name;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
A a = (A) o;
return Objects.equals(id, a.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}