主頁 > 前端設計 > Java8新特性筆記

Java8新特性筆記

2021-04-16 10:20:36 前端設計

Java8的新特性:

JAVA 8簡介:

Java8(又稱為jdk 1.8)是Java語言開發的一個主要版本,
Java8 是 Oracle公司于2014年3月發布,可以看成是自Java5以來最具革命性的版本,
Java8為Java語言、編譯器、類別庫、開發工具與JVM帶來了大量的新特性,

一、Java的新特性有哪些:

在這里插入圖片描述

1.2 Java8新特性的作用:

  • 速度更快
  • 代碼更少(增加了新的語法:Lambda運算式 )
  • 強大的 Stream API
  • 便于并行
  • 最大化減少空指標例外 :Optional
  • Nashorn引擎,允許在JVM運行JS應用

1.1 并行流與串行流

并行流就是把一個內容分成多個資料塊,并用不同的執行緒分別處理每個資料塊流,相比較串行的流,并行的流可以很大程度上提高程式的執行效率,

Java 8 中將并行進行了優化,我們可以很容易的對資料進行并行操作,
Stream API 可以宣告性的通過 parallel()sequential() 在并行流與順序流之間進行切換,

二、Lambda 運算式

2.1 為什么使用Lambda運算式?

Lambda 是一個匿名函式,我們可以把 Lambda 運算式理解為是一段可以傳遞的代碼 (將代碼像資料一樣進行傳遞) ,
使用它可以寫出更簡潔、更靈活的代碼,作為一種更緊湊的代碼風格,使Java的語言表達能力得到了提升,

2.2 Lambda運算式的使用

舉例:
(o1,o2) -> Integer.compare(o1,o2);
格式:
->:Lambda運算子 或 箭頭運算子
->:左邊:Lambda形參串列 (其實就是介面中的抽象方法的形參串列)
->:右邊:Lambda體 (其實就是重寫的抽象方法的方法體)

2.2.1 Lambda運算式的使用(分為六種情況)

① 語法格式一: 無參,無回傳值

Runnable r1 =	() ->{System.out.println("Hello wxy");};

實體:Runnable介面

public class LambdaTest1 {
	//語法格式一:無參,無回傳值
	@Test
	public void test1() {
		Runnable r1 = new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				System.out.println("無法停止轉動的地球人");
			}
			
		};
		r1.run();
		System.out.println("********Lambda的寫法*********");
		Runnable r2 = () -> System.out.println("無法停止轉動的地球人");
		r2.run();
		
	}

②語法格式二:Lambda需要一個引數,但是沒有回傳值

Consumer<String> con = (String str) -> {System.out.println(str);};

實體:Consumer介面

//語法格式二:Lambda需要一個引數,但是沒有回傳值
		public void test2() {
		Consumer<String> con = new Consumer<String>(){
			
			@Override
			public void accept(String s) {
				System.out.println(s);
				
			}
		};
		con.accept("謊言和誓言的區別是什么呢?");
		System.out.println("********Lambda的寫法*********");
		Consumer<String> con1 = (String s) -> {
			System.out.println(s);
			};
			con1.accept("一個是聽的人當真了,一個是說的人當真了");
			
	}

③語法格式三:資料型別可省略,因為可由編譯器推斷得出,稱為型別推斷

Consumer<String> con = (str) -> {System.out.println(str)}

代碼示例:

    //語法格式三:資料型別可以省略,因為可由編譯器推斷得出,稱為“型別推斷”
    @Test
    public void test3() {
    
        //未使用Lambda運算式
        Consumer<String> con = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };
        con.accept("你好啊Lambda!");
        System.out.println("====================");
        //使用Lambda運算式
        Consumer<String> con1 = (s) -> {
            System.out.println(s);
        };
        con1.accept("我是Lambda");
    }

④語法格式四:Lambda 若只需要一個引數時,引數的小括號可以省略

Consumer<String> con = str -> {System.out.println(str)}

代碼示例:

//語法格式四:Lambda 若只需要一個引數時,引數的小括號可以省略
    @Test
    public void test4() {
        //未使用Lambda運算式
        Consumer<String> con = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };
        con.accept("你好啊Lambda!");
        System.out.println("====================");
        //使用Lambda運算式
        Consumer<String> con1 = s -> {
            System.out.println(s);
        };
        con1.accept("我是Lambda");
    }

⑤語法格式五:Lambda 需要兩個或以上的引數,多條執行陳述句,并且可以有回傳值

 @Test
    public void test5() {
        //未使用Lambda運算式
        Comparator<Integer> com1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println(o1);
                System.out.println(o2);
                return Integer.compare(o1, o2);
            }
        };
        System.out.println(com1.compare(23, 45));
        System.out.println("====================");
        //使用Lambda運算式
        Comparator<Integer> com2 = (o1, o2) -> {
            System.out.println(o1);
            System.out.println(o2);
            return o1.compareTo(o2);
        };
        System.out.println(com2.compare(23, 12));
    }

⑥語法格式六:當Lamdba體只有一條陳述句時,return大括號若有,都可以省略

Comparator<Integer>com = (o1,o1) ->	Integer.compare(o1,o2);

語法格式:

//當Lamdba體只有一條陳述句時,return和大括號若有,都可以省略
	@Test
	public void test6(){
		Comparator<Integer> com1 = (o1,o2) ->{
			return o1.compareTo(o2);
		};
		System.out.println(com1.compare(13, 12));
	System.out.println("********Lambda運算式***********");
		Comparator<Integer> com2 = (o1,o2) -> o1.compareTo(o2);
		
		System.out.println(com2.compare(12, 21));
	}
	@Test
	public void test7(){
		Consumer<String> con2 = s -> {
			System.out.println(s);
		};
		con2.accept("一個是聽得人當真了,一個是說的人當真了");
	}
}

2.3 Lambda運算式使用總結

  • ->左邊:Lambda形參串列的引數型別可以省略(型別推斷);如果Lambda形參串列只有一個引數,其一對 ( ) 也可以省略
  • ->右邊:Lambda體應該使用一對{ }包裹;如果Lambda只有一條執行陳述句(可能是return陳述句),可以省略這一對 { }return關鍵字,

2.4 Lambda運算式總結

  • Lambda運算式的本質作為函式式介面的實體
  • 當你需要使用函式式介面寫一個匿名實作類的物件的時候你可以用Lambda運算式
  • 如果一個介面中, 只宣告了一個抽象方法,則此介面就稱為函式式介面,我們可以在一個介面上可以在一個介面上用@FunctionalInterface注解, 這樣做可以檢查它是否是一個函式式介面,
  • 所以以前用匿名實作類表達的現在都可以用Lambda運算式

三、函式式介面

3.1 函式式介面概述

  • 只包含一個抽象方法的介面,稱為函式式介面
  • 可以通過Lambda運算式來創建該介面的物件,(若Lambda運算式拋出一個受檢例外(即:非運行時例外),那么該例外需要在目標介面的抽象方法上進行宣告),
  • 可以在一個介面上使用@FunctionalInterface注解,這樣做可以檢查它是否是一個函式式介面,同時 javadoc也會包含一條宣告,說明這個介面是一個函式式介面,
  • java.util.function 包下定義了Java 8的豐富的函式式介面

3. Java內置函式式介面

3.1.1四大核心函式式介面

(T.)里面的.請忽略掉,

函式式介面引數型別回傳型別用途
Consumer<T.> 消費型別介面Tvoid對型別為T的物件應用操作, 包含方法:void accept(T t)
Supplier 供給型介面T回傳型別為T的物件,包含方法:T get()
Function<T,R> 函式型介面TR物件型別為T的物件應用操作,并回傳結果,結果是R型別的物件,包含方法:R apply(T t)
Predicate<T.> 斷定型介面Tboolean確定型別為T的物件是否滿足某約束,并回傳boolean值,包含方法:boolean test(T t)

代碼示例:

public class LambdaTest3 {
		//簡述:接受一個引數但是不回傳,(就像消費者,給他了東西但是不反回)
    //    消費型介面 Consumer<T>     void accept(T t)
    @Test
    public void test1() {
        //未使用Lambda運算式
        Learn("java", new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println("學習什么? " + s);
            }
        });
        System.out.println("====================");
        //使用Lambda表達
        Learn("html", s -> System.out.println("學習什么? " + s));

    }

    private void Learn(String s, Consumer<String> stringConsumer) {
        stringConsumer.accept(s);
    }
	//簡述:你不給他東西但是他回傳,
    //    供給型介面 Supplier<T>     T get()
    @Test
    public void test2() {
        //未使用Lambdabiaodas
        Supplier<String> sp = new Supplier<String>() {
            @Override
            public String get() {
                return new String("我能提供東西");
            }
        };
        System.out.println(sp.get());
        System.out.println("====================");
        //使用Lambda表達
        Supplier<String> sp1 = () -> new String("我能通過lambda提供東西");
        System.out.println(sp1.get());
    }
	//你放進去一個東西我給你回傳一個東西
    //函式型介面 Function<T,R>   R apply(T t)
    @Test
    public void test3() {
        //使用Lambda運算式
        Employee employee = new Employee(1001, "Tom", 45, 10000);

        Function<Employee, String> func1 =e->e.getName();
        System.out.println(func1.apply(employee));
        System.out.println("====================");

        //使用方法參考
        Function<Employee,String>func2 = Employee::getName;
        System.out.println(func2.apply(employee));

    }

    //斷定型介面 Predicate<T>    boolean test(T t)
    //傳進去是一個T	回傳一個結果是`true`還是`false`
    @Test
    public void test4() {
        //使用匿名內部類
        Function<Double, Long> func = new Function<Double, Long>() {
            @Override
            public Long apply(Double aDouble) {
                return Math.round(aDouble);
            }
        };
        System.out.println(func.apply(10.5));
        System.out.println("====================");

        //使用Lambda運算式
        Function<Double, Long> func1 = d -> Math.round(d);
        System.out.println(func1.apply(12.3));
        System.out.println("====================");

        //使用方法參考
        Function<Double,Long>func2 = Math::round;
        System.out.println(func2.apply(12.6));

    }
}

使用總結:

何時使用lambda運算式?

當需要對一個函式式介面實體化的時候,可以使用lambda運算式,

何時使用給定的函式式介面?

如果我們開發中需要定義一個函式式介面,首先看看在已有的jdk提供的函式式介面是否提供了能滿足需求的函式式介面,
如果有,則直接呼叫即可,不需要自己再自定義了,

四、方法的參考

4.1 概述:

方法參考可以看做是Lambda運算式深層次的表達
換句話說方法參考就是Lambda運算式,也就是函式式介面的一個實體通過方法的名字來指向一個方法

使用情景:

當要傳遞給Lambda體的操作,已經實作的方法了,可以使用方法參考

代碼格式:

格式:類(或物件) :: 方法名

使用情況:

  • 情況1 物件 :: 非靜態方法
  • 情況2 類 :: 靜態方法
  • 情況3 類 :: 非靜態方法

使用要求:

  1. 要求介面中的抽象方法的形參串列和回傳值型別與方法參考的方法的形參串列和回傳值型別相同!(針對于情況1和情況2)
  2. 當函式式介面方法的第一個引數是需要參考方法的呼叫者,并且第二個引數是需要參考方法的引數(或無引數)時:ClassName::methodName(針對于情況3)

使用建議:

如果給函式式介面提供實體,恰好滿足方法參考的使用情境,就可以考慮使用方法參考給函式式介面提供實體
如果不熟悉方法參考,那么還可以使用lambda運算式,

代碼實體:

public class MethodRefTest {

    // 情況一:物件 :: 實體方法
    //Consumer中的void accept(T t)
    //PrintStream中的void println(T t)
    @Test
    public void test1() {
        //使用Lambda表達
        Consumer<String> con1 = str -> System.out.println(str);
        con1.accept("中國");
        System.out.println("====================");

        //使用方法參考
        PrintStream ps = System.out;
        Consumer con2 = ps::println;
        con2.accept("China");

    }

    //Supplier中的T get()
    //Employee中的String getName()
    @Test
    public void test2() {
        //使用Lambda表達
        Employee emp = new Employee(1001, "Bruce", 34, 600);
        Supplier<String> sup1 = () -> emp.getName();
        System.out.println(sup1.get());
        System.out.println("====================");

        //使用方法參考
        Supplier sup2 = emp::getName;
        System.out.println(sup2.get());


    }

    // 情況二:類 :: 靜態方法
    //Comparator中的int compare(T t1,T t2)
    //Integer中的int compare(T t1,T t2)
    @Test
    public void test3() {
        //使用Lambda表達
        Comparator<Integer> com1 = (t1, t2) -> Integer.compare(t1, t2);
        System.out.println(com1.compare(32, 45));
        System.out.println("====================");

        //使用方法參考
        Comparator<Integer> com2 = Integer::compareTo;
        System.out.println(com2.compare(43, 34));
    }

    //Function中的R apply(T t)
    //Math中的Long round(Double d)
    @Test
    public void test4() {
        //使用匿名內部類
        Function<Double, Long> func = new Function<Double, Long>() {
            @Override
            public Long apply(Double aDouble) {
                return Math.round(aDouble);
            }
        };
        System.out.println(func.apply(10.5));
        System.out.println("====================");

        //使用Lambda運算式
        Function<Double, Long> func1 = d -> Math.round(d);
        System.out.println(func1.apply(12.3));
        System.out.println("====================");

        //使用方法參考
        Function<Double, Long> func2 = Math::round;
        System.out.println(func2.apply(12.6));


    }

    // 情況三:類 :: 實體方法
    // Comparator中的int comapre(T t1,T t2)
    // String中的int t1.compareTo(t2)
    @Test
    public void test5() {
        //使用Lambda運算式
        Comparator<String> com1 = (s1, s2) -> s1.compareTo(s2);
        System.out.println(com1.compare("abd", "aba"));
        System.out.println("====================");

        //使用方法參考
        Comparator<String> com2 = String::compareTo;
        System.out.println(com2.compare("abd", "abc"));
    }

    //BiPredicate中的boolean test(T t1, T t2);
    //String中的boolean t1.equals(t2)
    @Test
    public void test6() {
        //使用Lambda運算式
        BiPredicate<String, String> pre1 = (s1, s2) -> s1.equals(s2);
        System.out.println(pre1.test("abc", "abc"));
        System.out.println("====================");

        //使用方法參考
        BiPredicate<String, String> pre2 = String::equals;
        System.out.println(pre2.test("abc", "abd"));

    }

    // Function中的R apply(T t)
    // Employee中的String getName();
    @Test
    public void test7() {
        //使用Lambda運算式
        Employee employee = new Employee(1001, "Tom", 45, 10000);

        Function<Employee, String> func1 =e->e.getName();
        System.out.println(func1.apply(employee));
        System.out.println("====================");

        //使用方法參考
        Function<Employee,String>func2 = Employee::getName;
        System.out.println(func2.apply(employee));
    }
}

五、構造器和陣列的參考

5.1 使用格式:

方法參考:類名 ::new
陣列參考:陣列型別 [] :: new

5.2 使用要求:

5.2.1 構造器參考

和方法參考類似,函式式介面的抽象方法的形參串列和構造器的形參串列一致,抽象方法的回傳值型別即為構造器所屬的類的型別

5.2.2 陣列參考

可以把陣列看做是一個特殊的類,則寫法與構造器參考一致,

5.4 使用舉例

5.4.1 構造器的參考
//構造器參考
//Supplier中的T get()
@Test
public void test1() {
    //使用匿名內部類
    Supplier<Employee> sup = new Supplier<Employee>() {
        @Override
        public Employee get() {
            return new Employee();
        }
    };
    System.out.println(sup.get());
    //使用Lambda運算式
    System.out.println("====================");
    Supplier<Employee> sup1 = () -> new Employee(1001, "Tom", 43, 13333);
    System.out.println(sup1.get());

    //使用方法參考
    Supplier<Employee> sup2 = Employee::new;
    System.out.println(sup2.get());

}

//Function中的R apply(T t)
@Test
public void test2() {
    //使用Lambda運算式
    Function<Integer, Employee> func1 = id -> new Employee(id);
    Employee employee = func1.apply(1001);
    System.out.println(employee);
    System.out.println("====================");

    //使用方法參考
    Function<Integer, Employee> func2 = Employee::new;
    Employee employee1 = func2.apply(1002);
    System.out.println(employee1);

}

//BiFunction中的R apply(T t,U u)
@Test
public void test3() {
    //使用Lambda運算式
    BiFunction<Integer, String, Employee> func1 = (id, name) -> new Employee(id, name);
    System.out.println(func1.apply(1001, "Tom"));
    System.out.println("====================");

    //使用方法參考
    BiFunction<Integer, String, Employee> func2 = Employee::new;
    System.out.println(func2.apply(1002, "Jarry"));
}
5.4.2 陣列參考

//陣列參考
//Function中的R apply(T t)
@Test
public void test4() {
    Function<Integer, String[]> func1 = length -> new String[length];
    String[] arr1 = func1.apply(5);
    System.out.println(Arrays.toString(arr1));

    System.out.println("====================");

    //使用方法參考
    Function<Integer,String[]>func2=String[]::new;
    String[] arr2 = func2.apply(10);
    System.out.println(Arrays.toString(arr2));
}

六、StreamAPI

6.1 Stream API概述

  • Stream關注的是對資料的運算,與CPU打交道;集合關注的是資料的存盤,與記憶體打交道;
  • Java8提供了一套api,使用這套api可以對記憶體中的資料進行過濾排序映射歸約等操作,類似于sql對資料庫中表的相關操作,
  • Stream是資料渠道,用于操作資料源(集合、陣列等)所生成的元素序列,集合講的是資料Stream講的是計算

使用注意點:

  1. Stream 自己不會存盤元素
  2. Stream 不會改變源物件,相反,他們會回傳一個持有結果的新Stream,
  3. Stream 操作是延遲執行的,這意味著他們會等到需要結果的時候才執行,

Stream使用流程

  1. Stream的實體化
  2. 一系列的中間操作(過濾、映射、…)
  3. 終止操作

在這里插入圖片描述
使用流程中的注意點:

  • 一個中間操作鏈,對資料源的資料進行處理
  • 一旦執行終止操作,就執行中間操作鏈,并產生結果,之后,不會再被使用

6.2 使用方法

6.2.1 步驟一 創建Stream

① 創建方式一:通過集合

Java 8的Collection介面被擴展,提供了兩個獲取流的方法:

  • default Stream\<E> stream() : 回傳一個順序流
  • default Stream\<E> parallelStream() : 回傳一個并行流

②創建方式二:通過陣列

Java 8中的Arrays的靜態方法stream()可以獲取陣列流

  • 呼叫Arrays類的 static\<T> Stream\<T> stream(T[] array): 回傳一個流
  • 多載形式,能夠處理對應基本型別的陣列:
    - public static IntStream stream(int[] array)
    - public static LongStream stream(long[] array)
    - public static DoubleStream stream(double[] array)

③ 創建方式三:通過Stream的of()方法

可以呼叫Stream類靜態方法of(),通過顯示值創建一個流,可以用于接收任意數量的引數

  • public static \<T>Stream\<T> of(T...values):回傳一個流

④創建方式四:創建無限流

  • 迭代: public static\<T> Stream\<T> iterate(final T seed, final UnaryOperator\<T> f)
  • 生成: public static\<T> Stream\<T> generate(Supplier\<T> s)

代碼示例:

public class StreamAPITest1 {
    //創建 Stream方式一:通過集合
    @Test
    public void test1() {
        List<Employee> employees = EmployeeData.getEmployees();
        //efault Stream<E> stream() : 回傳一個順序流
        Stream<Employee> stream = employees.stream();

        //default Stream<E> parallelStream() : 回傳一個并行流
        Stream<Employee> employeeStream = employees.parallelStream();
    }

    //創建 Stream方式二:通過陣列
    @Test
    public void test2() {
        int[] arrs = {1, 2, 3, 6, 2};
        //呼叫Arrays類的static <T> Stream<T> stream(T[] array): 回傳一個流
        IntStream stream = Arrays.stream(arrs);

        Employee e1 = new Employee(1001, "Tom");
        Employee e2 = new Employee(1002, "Jerry");
        Employee[] employees = {e1, e2};
        Stream<Employee> stream1 = Arrays.stream(employees);
    }

    //創建 Stream方式三:通過Stream的of()
    @Test
    public void test3() {
        Stream<Integer> integerStream = Stream.of(12, 34, 45, 65, 76);
    }

    //創建 Stream方式四:創建無限流
    @Test
    public void test4() {

        //迭代
        //public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f)
        //遍歷前10個偶數
        Stream.iterate(0, t -> t + 2).limit(10).forEach(System.out::println);

        //生成
        //public static<T> Stream<T> generate(Supplier<T> s)
        Stream.generate(Math::random).limit(10).forEach(System.out::println);
    }
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/276638.html

標籤:其他

上一篇:對Vue生命周期的一些簡單見解

下一篇:select下拉選項的selectedIndex屬性(你用過嗎)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more