Java 構文5

HashMap

import java.util.*;

public class MyApp{
  public static void main(String[] args){
      HashMap<String, Integer> sales = new HashMap<>();

      sales.put("tom", 10);
      sales.put("john", 20);
      sales.put("mason", 30);

          System.out.println(sales.get("tom"));
          System.out.println(sales.size());

          for (Map.Entry<String, Integer> sale: sales.entrySet()){
            System.out.println(sale.getKey() + ":" + sale.getValue());
          }
    }
}

StreamAPI

import java.util.*;

public class MyApp{
  public static void main(String[] args){

      List<Integer> sales = new ArrayList<>(Arrays.asList(12, 30, 22, 4, 9));
      sales
       .stream()
       // 中間処理
       .filter(e -> e % 3 == 0)
       // 終端処理
       .map(e -> "(" + e+ ")")
       .forEach(System.out::println);
    }
}

LocalDateTime

import java.time.*;
import java.time.format.DateTimeFormatter;

public class MyApp{
  public static void main(String[] args){
      LocalDateTime d = LocalDateTime.now();
      // LocalDateTime d = LocalDateTime.of(2017, 1, 1, 10, 10, 10);
      // LocalDateTime d = LocalDateTime.parse("2016-12-12T10:10:10");

      System.out.println(d.getYear());
      System.out.println(d.getMonth());
      System.out.println(d.getMonth().getValue());

      System.out.println(d.plusMonths(2).minusDays(3));
      DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy!MM!dd!");
      System.out.println(d.format(dtf));
    }
}

Java 構文4

例外

// 例外処理
class MyException extends Exception {
  public MyException(String s){
    super(s);
  }
}

public class MyApp{

  public static void div(int a, int b){
    try {
      if (b < 0){
        throw new MyException("not minus!");
      }
      System.out.println(a / b);
    } catch (ArithmeticException e){
      System.err.println(e.getMessage());
    } catch (MyException e){
      System.err.println(e.getMessage());
    } finally{
      System.out.println(" -- end -- ");
    }
  }
  public static void main(String[] args){
    div(3, 0);
    div(5, -2);
  }
}

ラッパークラス

public class MyApp{
  public static void main(String[] args){
    // Integer i = new Integer(32);
    // int n = i.intValue();
    Integer i = 32; // auto boxing
    i = null;
    int n = i; // auto unboxing
    
    System.out.println();
  }
}

generics:型の汎用化

class MyData<T> {
  public void getThree(T x){
    System.out.println(x);
    System.out.println(x);
    System.out.println(x);
  }
}

public class MyApp{
  public static void main(String[] args){
    // MyInteger mi = new MyInteger();
    // mi.getThree(55);
    MyData<Integer> i = new MyData<>();
    i.getThree(32);
    MyData<String> s = new MyData<>();
    s.getThree("hello");
  }
}

Thread処理:

class MyRunnable implements Runnable{
  @Override
  public void run(){
    for (int i= 0; i < 500; i++){
      System.out.print('*');
    }
  }
}

public class MyApp{
  public static void main(String[] args){
    MyRunnable r = new MyRunnable();
    Thread t = new Thread(r);
    t.start();

    for (int i= 0; i < 500; i++){
      System.out.print('.');
    }
  }
}

無名クラス

public class MyApp{
  public static void main(String[] args){
    // MyRunnable r = new MyRunnable();
    // Thread t = new Thread(r);
    // t.start();
    new Thread(new Runnable(){
      @Override
      public void run(){
        for (int i= 0; i < 500; i++){
          System.out.print('*');
        }
      }
    }).start(); // 無名クラス

    for (int i= 0; i < 500; i++){
      System.out.print('.');
    }
  }
}

Stringクラス

public class MyApp{
  public static void main(String[] args){
      String s = "abcdef";
      System.out.print(s.length());
      System.out.print(s.substring(2, 5));
      System.out.print(s.replaceAll("ab","AB"));

      String s1 = "ab";
      String s2 = "ab";

      if (s1.equals(s2)){
        System.out.print("same!");
      }

      if (s1 == s2){
        System.out.print("same!same!");
      }
    }
}

printfメソッド

public class MyApp{
  public static void main(String[] args){
    int score=50;
    double height=165.8;
    String name ="yoshimoto";

      System.out.printf("name: %s, score: %d, height: %f\n", name, score, height);
      System.out.printf("name: %-10s, score: %10d, height: %5.2f\n", name, score, height);

      String s = String.format("name: %10s, score: %-10d, height: %5.2f\n", name, score, height);
      System.out.println(s);
    }
}

Math, randomクラス

import java.util.Random;

public class MyApp{
  public static void main(String[] args){
      double d = 53.234;
      System.out.println(Math.ceil(d));
      System.out.println(Math.floor(d));
      System.out.println(Math.round(d));
      System.out.println(Math.PI);

      Random r = new Random();
      System.out.println(r.nextDouble()); // 0-1
      System.out.println(r.nextInt(100)); // 0-1
      System.out.println(r.nextBoolean()); // 0-1
    }
}

ArrayList

import java.util.*;

public class MyApp{
  public static void main(String[] args){
      List sales = new ArrayList<>();

      sales.add(10);
      sales.add(20);
      sales.add(30);

      for (int i = 0; i < sales.size(); i++){
        System.out.println(sales.get(i));
      }

      sales.set(0, 100);
      sales.remove(2);

      for (Integer sale: sales){
        System.out.println(sale);
      }

    }
}

Hash.set

import java.util.*;

public class MyApp{
  public static void main(String[] args){
      HashSet sales = new HashSet<>();

      sales.add(10);
      sales.add(20);
      sales.add(30);
      sales.add(10);

        System.out.println(sales.size());

        for (Integer sale: sales){
          System.out.println(sale);
        }
        sales.remove(30);
        for (Integer sale: sales){
          System.out.println(sale);
        }
    }
}

Java 構文3

getter, setter

class User {
  private String name;
  private int score;

  public User(String name, int score){
    this.name = name;
    this.score = score;
  }

  public int getScore(){ //getter
    return this.score;
  }

  public void setScore(int score){
    if (score > 0) {
    this.score = score;
   }
  }

}

public class MyApp{

  public static void main(String[] args){
    User tom = new User("tom", 65); // instance
    tom.setScore(85);
    tom.setScore(-22);
    System.out.println(tom.getScore());
  }
}

static:インスタンス化しなくても、クラスから直接扱えるフィールドやメソッドを定義できます。

class User {
  private String name;
  private static int count = 0;

  public User(String name){
    this.name = name;
    User.count++;
  }

  public static void getInfo(){
    System.out.println("# of instances: " + User.count);
  }

}

public class MyApp{

  public static void main(String[] args){
    User.getInfo();
    User tom = new User("tom");
    User.getInfo();
  }
}

initializer

class User {
  private String name;
  private static int count; //クラス変数

  static {
    User.count = 0;
    System.out.println("static initializer");
  }

  {
    System.out.println("Instance initializer");
  }

  public User(String name){
    this.name = name;
    User.count++;
    System.out.println("constructor initializer");
  }

  public static void getInfo(){
    System.out.println("# of instances: " + User.count);
  }

}

変更できないfinal修飾子

// final 変更できない

final class User {
  protected String name;
  private static final double VERSION = 1.1;

  public User(String name){
    this.name = name;
    User.VERSION = 1.2;
  }

  public final void sayHi(){
    System.out.println("hi! " + this.name);
  }
}

class AdminUser extends User {
  public AdminUser(String name){
    super(name);
  }

  @override
  public void sayHi(){
    System.out.println("[Admin]hi!" + this.name);
  }
}

public class MyApp{

  public static void main(String[] args){
    User tom = new User("tom");
  }
}

抽象クラス

//抽象クラス -> 具象クラス

abstract class User {
  public abstract void sayHi();
}

class JapaneseUser extends User {
  @Override
  public void sayHi(){
    System.out.println("こんにちは!");
  }
}

class AmericanUser extends User {
  @Override
  public void sayHi(){
    System.out.println("hi!");
  }
}

public class MyApp{

  public static void main(String[] args){
    AmericanUser tom = new AmericanUser();
    JapaneseUser aki = new JapaneseUser();
    tom.sayHi();
    aki.sayHi();
  }
}

interface

//interface

interface Printable {
  //定数、
double VERSION = 1.2;
  //抽象
  void print();
 // default method
 public default void getInfo(){
   System.out.println("I/F ver. " + Printable.VERSION);
 }
 // static
}


class User implements Printable {
  @Override
  public void print(){
    System.out.println("Now printing user prifile...");
  }

}

public class MyApp{

  public static void main(String[] args){
    User tom = new User();
    tom.print();
    tom.getInfo();
  }
}

列挙型とordinal()

// 列挙型
enum Result {
  SUCCESS,
  ERROR,
}

public class MyApp{

  public static void main(String[] args){
    Result res;

    res = Result.ERROR;

    switch (res){
      case SUCCESS:
      System.out.println("OK!");
      System.out.println(res.ordinal());
      break;
      case ERROR:
      System.out.println("NG!");
      System.out.println(res.ordinal());
      break;
    }

  }
}

Java packageの書き方

クラス

class User {
  String name = "Me"; // field

  void sayHi(){
    System.out.println("hi!");
  }
}

public class MyApp{

  public static void main(String[] args){

    User tom;
    tom = new User(); // instance
    System.out.println(tom.name);
    tom.sayHi();
  }
}

コンストラクター:クラスの初期化

class User {
  String name;

  // constructor
  User(String name){
    this.name = name;
  }

  // User(){
  //   this.name = "me";
  // }

  User(){
    this("me!");
  }

  void sayHi(){
    System.out.println("hi!" + this.name);
  }
}

public class MyApp{

  public static void main(String[] args){

    User tom;
    tom = new User(); // instance
    System.out.println(tom.name);
    tom.sayHi();
  }
}

クラスの継承とoverride

class User {
  String name;

  User(String name){
    this.name = name;
  }

  void sayHi(){
    System.out.println("hi!" + this.name);
  }
}

class AdminUser extends User {
  AdminUser(String name){
    super(name);
  }
  void sayHello(){
    System.out.println("hello!" + this.name);
  }

  // override
  @Override
  void sayHi(){
    System.out.println("[admin] hi!" + this.name);
  }

}

public class MyApp{
  public static void main(String[] args){

    User tom = new User("tom"); // instance
    System.out.println(tom.name);
    tom.sayHi();

    AdminUser bob = new AdminUser("bob"); // instance
    System.out.println(bob.name);
    bob.sayHi();
    bob.sayHello();
  }
}

public:アクセス可
private:同じクラスならアクセス可能
protected:同じパッケージのみ

パッケージ化
com/hpscript/myapp/MyApp.java

package com.hpscript.myapp;
import com.hpscript.myapp.model.User;
import com.hpscript.myapp.model.AdminUser;
// import hpscript.myapp.model.*;

public class MyApp{
  public static void main(String[] args){

    User tom = new User("tom"); // instance
    // System.out.println(tom.name);
    tom.sayHi();

    AdminUser bob = new AdminUser("bob"); // instance
    // System.out.println(bob.name);
    bob.sayHi();
    bob.sayHello();
  }
}

com/hpscript/myapp/model/User.java

package com.hpscript.myapp.model;

public class User {
  protected String name;

  public User(String name){
    this.name = name;
  }

  public void sayHi(){
    System.out.println("hi!" + this.name);
  }
}

com/hpscript/myapp/model/AdminUser.java

package com.hpscript.myapp.model;

public class AdminUser extends User {
  public AdminUser(String name){
    super(name);
  }
  public void sayHello(){
    System.out.println("hello!" + this.name);
  }

  // override
  @Override
  public void sayHi(){
    System.out.println("[admin] hi!" + this.name);
  }

}

java 構文

条件分岐

int score = 35;
    if (score > 80){
      System.out.println("great");
    } else if (score> 60){
      System.out.println("good");
    } else {
    System.out.println("soso");
  }
int score = 65;
  String msg = score > 80 ? "great" : "soso...";

switch

String signal = "red";
    switch (signal){
      case "red":
        System.out.println("stop!");
        break;
      case "blue":
        System.out.println("go");
        break;
      case "yellow":
        System.out.println("caution");
        break;
      default:
        System.out.println("wrong signal");
        break;

while, do while

int i = 0;
    while (i < 10){
      System.out.println(i);
      i++;
    } 
int i = 0;
    do {
      System.out.println(i);
      i++;
    } while (i < 10);

for

for(int i = 0; i < 10; i++){
        if (i == 5){
          break;
        }
        System.out.println(i);
      }

array

      int[] sales;
      sales = new int[3];
      sales[0] = 100;
      sales[1] = 200;
      sales[2] = 300;
      sales[1] = 1000;
      System.out.println(sales[1]);
      // int[] sales:
      // sales = new int[](100, 200, 300);

      int[] sales = {100, 200, 300}

要素の操作

int[] sales = {700, 300, 500};

      for (int i = 0; i < sales.length; i++){
        System.out.println(sales[i]);
      }

int[] sales = {700, 300, 500};

      for (int sale : sales){
        System.out.println(sale);
      }

参照型にはメモリ領域のバッチが入ります。文字列の場合は、変更不可となります。

      int[] a = {3, 5, 7};
      int[] b = a;
      b[1] = 8;
      System.out.println(a[1]);
      System.out.println(b[1]);
      String s = "hello";
      String t = s;
      t = "world";

メソッド

public static void sayHi(String name){
    System.out.println("hi!" + name);
  }

  public static void main(String[] args){
    sayHi("jack");
  }

public static String sayHi(String name){
    return "hi!" + name;
  }

  public static void main(String[] args){
    String msg = sayHi("jack");
    System.out.println(msg);
  }

オーバーロード

public static void sayHi(){
    System.out.printl("hi! nobody");
  }

  public static void main(String[] args){
    sayHi("jack"); //引数
    sayHi();
  }

open-java JDK8

開発環境にJDKをインストールします。javaは.classにコンパイルすれば、Linux以外のOS(mac, windows等)のJRE(Java Runtime Environment)/JVM(Java Virtual Machine)で実行することが可能です。Run anywhereの思想です。

http://openjdk.java.net/install/

[vagrant@localhost java]$ sudo yum -y install java-1.8.0-openjdk-devel

ターミナルからのコンパイル方法です。

public class MyApp{

  public static void main(String[] args){

    String msg;
    msg = "Hello Wrold again";
    System.out.println(msg);
  }
}
[vagrant@localhost java]$ javac MyApp.java
[vagrant@localhost java]$ java MyApp
Hello Wrold again

データ型

    char a = 'a';
    int x = 10;
    long y = 5555555555L;
    double d = 23423.344;
    float f = 32.33F;
    boolean flag = true; // false
    // \n \t

演算

// 演算
    int i;
    i = 10 / 3;
    i = 10 % 3;
    int x = 5;
    x++;
    x--;
    int x = 5;
    x = x + 12;
    x += 12;
    String s;
    s = "hello " + "world";

型変換(cast)

    double d = 452323.231;
    int i = (int)d;
    int i = 10;
    double d = i / 4

Android Fragment

Fragmentは、Activity でのユーザー インターフェースの挙動や部位を表すものです。 1 つのアクティビティに複数のフラグメントを組み合わせてマルチペインの UI をビルドしたり、複数のアクティビティでフラグメントを再利用したりできます。

TitlesFragment.java

package self.myfragmentapp;

import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.widget.ArrayAdapter;


public class TitlesFragment extends ListFragment {

    public TitlesFragment() {}

    @Override
    public void onActivityCreated(Bundle savedInstanceState){
        super.onActivityCreated(savedInstanceState);

        setListAdapter(new ArrayAdapter<String>(
                getActivity(),
                android.R.layout.simple_list_item_1,
                News.Titles
        ));
    }
}

sqliteの設定

ContractとOpenHelperのクラスを作成します。OepnHelperはSQLiteOpenHelperを継承します。
New->Other->ContentProviderから新規にcomponentを作成し、呼び出します。authorityは、packageとContentProvider名です。(self.mymemoapp.MemeoContentProvider)

package self.mymemoapp;

import android.provider.BaseColumns;


public final class MemoContract {

    public MemoContract(){}

    public static abstract class Memos implements BaseColumns {
        public static final String TABLE_NAME = "memos";
        public static final String COL_TITLE = "title";
        public static final String COL_BODY = "body";
        public static final String COL_CREATE = "created";
        public static final String TABLE_UPDATE = "updated";
    }
}
package self.mymemoapp;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MemoOpenHelper extends SQLiteOpenHelper {
    public static final String DB_NAME = "myapp.db";
    public static final int DB_VERSION = 1;

    public static final String CREATE_TABLE =
            "create table memos (" +
                "_id integer primary key autoincrement, "+
            "title text, " +
            "body text, " +
            "created datetime default current_timestamp, " +
            "updated datetime default current_timestamp)";

    public static final String INIT_TABLE =
            "insert into memos (title, body) values " +
                    "('t1', 'b1'), " +
                    "('t2', 'b2'), " +
                    "('t3', 'b3'), ";

    public static final String DROP_TABLE =
            "drop table if exists " + MemoContract.Memos.TABLE_NAME;

    public MemoOpenHelper(Context c){
        super(c, DB_NAME, null, DB_VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        db.execSQL(CREATE_TABLE);
        db.execSQL(INIT_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        db.execSQL(DROP_TABLE);
        onCreate(db);
    }
}

SQLiteとAndroid

UserOpenHelperでSQLiteOpenHelperを継承します。

package self.mydbapp;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * Created by narishige on 2016/11/21.
 */

public class UserOpenHelper extends SQLiteOpenHelper {

    public static final String DB_NAME = "myapp.db";
    public static final int DB_VERSION = 1;
    public static final String CREATE_TABLE =
            "create table " + UserContract.Users.TABLE_NAME + " (" +
                    UserContract.Users._ID + " integer primary key autoincrement," +
                    UserContract.Users.COL_NAME + "name text," +
                    UserContract.Users.COL_SCORE + "score integer)";
    public static final String INIT_TABLE =
            "insert into users (name, score) values " +
                    "('yoshimoto', 55), " +
                    "('kimura', 45), " +
                    "('igarashi', 82)";
    public static final String DROP_TABLE =
            "drop table if exists users";

    public UserOpenHelper(Context c){
        super(c, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        // create table
        sqLiteDatabase.execSQL(CREATE_TABLE);
        // init table
        sqLiteDatabase.execSQL(INIT_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        // drop table
        sqLiteDatabase.execSQL(DROP_TABLE);
        // onCreate
        onCreate(sqLiteDatabase);
    }
}

insert, delete, update

        UserOpenHelper userOpenHelper = new UserOpenHelper(this);
        SQLiteDatabase db = userOpenHelper.getWritableDatabase();
        // open db
        ContentValues newUser = new ContentValues();
        newUser.put(UserContract.Users.COL_NAME, "tanaka");
        newUser.put(UserContract.Users.COL_SCORE, "42");
        long newID = db.insert(
          UserContract.Users.TABLE_NAME,
                null,
                newUser
        );
        
        ContentValues newScore = new ContentValues();
        newScore.put(UserContract.Users.COL_SCORE, 100);
        int updatedCount = db.update(
                UserContract.Users.TABLE_NAME,
                newScore,
                UserContract.Users.COL_NAME + " = ?",
                new String[] {"sakai"}
        );
        int deletedCount = db.delete(
          UserContract.Users.TABLE_NAME,
                UserContract.Users.COL_NAME + " = ?",
                new String[] {"sakai"}
        );
        
        Cursor c = null;
        c = db.query(
                UserContract.Users.TABLE_NAME,
                null, // fields
                null, // where
                null, // where arg
                null, // groupby
                null,
                null
        );

トランザクション

 try {
            db.beginTransaction();
            db.execSQL("update users " +
                    "set score = score + 10 " +
                    "where name = 'kaneko'");
            db.execSQL("update users " +
                    "set score = score + 10 " +
                    "where name = 'muraoka'");
        } catch(SQLException e){
            e.printStackTrace();
        } finally {
            db.endTransaction();
        }

ブラウザ

%e7%84%a1%e9%a1%8c

package self.mybrowser;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Patterns;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    private WebView myWebView;
    private EditText urlText;

    private static final String INITIAL_WEBSITE = "http://finance.yahoo.co.jp";



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myWebView = (WebView) findViewById(R.id.myWebView);
        urlText = (EditText) findViewById(R.id.urlText);

        myWebView.getSettings().setJavaScriptEnabled(true);
        myWebView.setWebViewClient(new WebViewClient(){
            @Override
                    public void onPageFinished(WebView view, String url){
                getSupportActionBar().setSubtitle(view.getTitle());
                urlText.setText(url);
            }
        });
        myWebView.loadUrl(INITIAL_WEBSITE);
    }

    public void clearUrl(View view){
        urlText.setText("");
    }

    public void showWebSite(View view){
        String url = urlText.getText().toString().trim();

        if (!Patterns.WEB_URL.matcher(url).matches()){
            urlText.setError("Invalid URL");
        } else {
            if(url.startsWith("http;//") && !url.startsWith("https://")){
                url = "http://" + url;
            }
            myWebView.loadUrl(url);
        }
    }

    @Override
    public void onBackPressed(){
        if (myWebView.canGoBack()){
            myWebView.goBack();
            return;
        }
        super.onBackPressed();
    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        if(myWebView != null){
            myWebView.stopLoading();
            myWebView.setWebViewClient(null);
            myWebView.destroy();
        }
        myWebView = null;
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="self.mybrowserapp.MainActivity">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <EditText
            android:layout_weight="1"
            android:id="@+id/urlText"
            android:layout_width="0dp"
            android:onClick="clearUrl"
            android:inputType="text|textNoSuggestions"
            android:layout_height="wrap_content"/>

        <Button
            android:text="Browse"
            android:onClick="showWebsite"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <WebView
        android:layout_weight="1"
        android:id="@+id/myWebView"
        android:layout_width="match_parent"
        android:layout_height="0dp"></WebView>

</LinearLayout>