Javaの勉強

趣味でマクロを書き始めました。

ラムダ式について

ラムダ式について調べたことなど

関数型インターフェース

抽象メソッドが一つだけ宣言されているインターフェース。 この時、一つだけ宣言されている抽象メソッドのことをSAM(Single Abstract Method)と呼ぶ。

java.util.functionパッケージ

合計43個のインターフェースが提供されている。 基本となるインターフェースが4つあり、のこりはその派生型。 以下が基本の4つ。

  • Supplier

  • Predicate

  • Consumer

  • Function

Supplier

供給者。引数を受け取らず、T型の値を返す抽象メソッド。

public class Lamda_Test {

    /**
    * @param args
    */
    public static void main(String[] args) {

        //■匿名クラス
        Supplier<String> supplier = new Supplier<String>(){
            public String get(){
                return "匿名クラスで戻り値";
            }
        };

        System.out.println(supplier.get());


        //■ラムダ式
        Supplier<String> supplierLamda = () -> "ラムダ式で戻り値";

        System.out.println(supplierLamda.get());
    }

}

■実行結果
匿名クラスで戻り値
ラムダ式で戻り値

Predicate

述部、述語。T型の値を受け取ってなんらかの判定を行い、結果の真偽値を返す。

package lamdaTest;

import java.util.function.Predicate;

public class PredicateTest {

    public static void main(String[] args) {

        //■匿名クラス
        Predicate<String> predicate = new Predicate<String>(){
            public boolean test(String str){
                return str.length() > 3;
            }
        };

        System.out.println(predicate.test("匿名クラス"));


        //■ラムダ式
        Predicate<String> predicateLamda = (String str) -> str.length() > 3;

        System.out.println(predicateLamda.test("ラムダ"));
    }

}

■実行結果
true
false

Consumer

消費者。T型の値を受け取って処理を行う。戻り値は返さず、消費するだけのメソッド。
acceptは受け取るの意味。

package lamdaTest;

import java.util.function.Consumer;

public class ConnsumerTest {

    public static void main(String[] args) {

        //■匿名クラス
        Consumer<String> consumer = new Consumer<String>(){
            public void accept(String str){
                System.out.println(str + "を表示しました。");
            }
        };

        consumer.accept("匿名クラス");


        //■ラムダ式
        Consumer<String> consumerLamda =
                (String str) -> System.out.println(str + "を表示しました。");

        consumerLamda.accept("ラムダ式");



    }

}

■実行結果
匿名クラスを表示しました。
ラムダ式を表示しました。

Function<T,R>

関数の意味。T型の値を受け取ってR型の戻り値を返す。
applyは適用するの意味。

package lamdaTest;

import java.util.function.Function;

public class FunctionTest {

    public static void main(String[] args) {

        //■匿名クラス
        Function<String,String> function = new Function<String,String>(){
            public String apply(String str){
                 return str.concat( "です");
            }
        };

        System.out.println(function.apply("匿名クラス"));


        //■ラムダ式
        Function<String,String> funcionLamda = (String str) -> str.concat("です。");

        System.out.println(funcionLamda.apply("ラムダ式"));
    }

}

■実行結果
匿名クラスです
ラムダ式です。

STSでMaven Projectを作成するときに詰まったところ

【今回の目標】
Maven Projectを作成してHomePageを表示する。

【教本】
Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発。
698ページからの付録

【教本の手順以外に手を加えたところ①】
(707P)
/WEB-INF/include.jspの作成
ファイルパスは以上の個所に作成。以下ソースコード

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

上記の<%@ taglib>を加えたときにuriにエラーが発生した。/WEB-INF/libを作成し、以下のページからダウンロードしたjarファイルを格納すると解消される
taglibs-standard-impl-1.2.5.jarをダウンロードする。

Apache Tomcat® - Apache Taglibs Downloads

【教本の手順以外に手を加えたところ①】
(708P)
アプリケーションサーバーにデプロイし、実行すると500エラーが発生。

HTTPステータス 500 - Internal Server Error


Type Exception Report

メッセージ /WEB-INF/include.jsp (line: [1], column: [2]) jsp-property-group中に指定されているPage-encoding [UTF-8] がpage指示子中の指定 [ISO-8859-1] と違います

説明 The server encountered an unexpected condition that prevented it from fulfilling the request.

例外 org.apache.jasper.JasperException: /WEB-INF/include.jsp (line: [1], column: [2]) jsp-property-group中に指定されているPage-encoding [UTF-8] がpage指示子中の指定 [ISO-8859-1] と違います org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:42) org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:292) org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:115) org.apache.jasper.compiler.Validator$DirectiveVisitor.comparePageEncodings(Validator.java:352) org.apache.jasper.compiler.Validator$DirectiveVisitor.visit(Validator.java:202) org.apache.jasper.compiler.Node$PageDirective.accept(Node.java:579) org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2389) org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2441) org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2447) org.apache.jasper.compiler.Node$Root.accept(Node.java:470) org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2389) org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2441) org.apache.jasper.compiler.Validator$DirectiveVisitor.visit(Validator.java:104) org.apache.jasper.compiler.Node$IncludeDirective.accept(Node.java:643) org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2389) org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2441) org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2447) org.apache.jasper.compiler.Node$Root.accept(Node.java:470) org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2389) org.apache.jasper.compiler.Validator.validateDirectives(Validator.java:1816) org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:203) org.apache.jasper.compiler.Compiler.compile(Compiler.java:385) org.apache.jasper.compiler.Compiler.compile(Compiler.java:362) org.apache.jasper.compiler.Compiler.compile(Compiler.java:346) org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:603) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

注意 原因のすべてのスタックトレースは、のログに記録されています
【解決策】
文字コードが違うといわれているようなので、pageEncoding="ISO-8859-1"のところをpageEncoding="UTF-8"に変更すると解消された。
以下ソースコード

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

JavaSilverの勉強(継承について)

こんにちは。僕です。

業務とは全然関係ないなりに、JavaSilverの勉強をしています。

継承のところでいまいちわからないところがあったので備忘録。

スーパークラスの型として宣言した後に、サブクラスにダウンキャストして同じ変数に再代入しようとすると、サブクラスで初めて定義されたメソッドを使おうとしたときにコンパイルエラーになるみたい(画像の反転の位置)。

■違う変数を宣言するときに、すでにスーパークラス型でインスタンス化されたものにダウンキャストを行うとエラーは出ない(反転の下の行)。

f:id:mznkmznk-mznk:20180321231608j:plain

ちなみに、スーパークラスとサブクラスはこんな感じです。

■こっちがスーパークラス。run()メソッドがない状態ですね。

f:id:mznkmznk-mznk:20180321231430j:plain

■こっちはサブクラス。子供は元気に駆け回ります。

f:id:mznkmznk-mznk:20180321231326j:plain