黄油刀

article/2025/10/21 17:41:31

【攻克Android (34)】Butter Knife 黄油刀

  • 博客分类: 
  • 攻克Android系列
本文围绕以下四个部分展开: 

一、注解式框架 
二、Butter Knife 
案例一 
案例二:用 ListView 展示一个列表数据,每个Item里含有一个Button,可以点击。 






一、注解式框架
 

         1. 注解式开发: 

         JDK 1.5后支持注解方式。想用注解式开发,就要自定义注解。 

         @Override就是一种自带的注解。很多框架都采用注解方式来实现。 

         当追求更高的开发效率,用更简洁的代码、更清晰的代码逻辑来进行高效的开发的时候,使用注解式框架开发可简化代码提升开发效率代码的可读性。 



         2. 主流注解式框架: 

         (1)AndroidAnnotations 

         配置麻烦,需要在功能清单文件中注册生成的子类。反射机制会占用资源内存,且耗时。 

         (2)Dagger 

         采用预编译技术,高效。但是对View绑定操作注解不是很方便。 

         (3)Butter Knife 

         它是View 及事件等依赖注入框架。使用方便,配置简单,有强大的View注入绑定和简单的常用方法注解。 


二、Butter Knife 

         它是View 及事件等依赖注入框架。 

         1. 特点: 

         (1)强大的View注入绑定和Click事件的处理。简化代码,提升开发效率。 

         (2)可以方便地处理ListView的Adapter里的ViewHolder绑定问题。 

         (3)运行时不会影响App效率,使用配置方便。 

         (4)代码思路清晰,可读性强。 

         2. 用法: 

         导包: 

         compile 'com.jakewharton:butterknife:6.0.0' 

         在当前 Activity(this)的onCreate中注册(注入黄油刀): 

Java代码   收藏代码
  1. ButterKnife.inject(this);  


         (1)View绑定(绑定控件): 

         Activity声明绑定控件: 

Java代码   收藏代码
  1. @InjectView(R.id.tvTitle)   
  2. TextView tvTitle;  


         黄油刀注入控件,相当于:先声明变量,然后通过 findViewById(R.id.tvCompany) 初始化变量。黄油刀直接帮我们绑定好了控件: 

         InjectView: Bind a field to the view for the specified ID. The view will automatically be cast to the field type. 

Java代码   收藏代码
  1. @InjectView(R.id.tvTitle) // 相当于 通过 findViewById(R.id.tvCompany) 初始化变量。  
  2. TextView tvTitle; // 相当于 声明变量:private TextView tvCompany;  


         注意:不同写为:private TextView tvTitle;  会报错:@InjectView fields must not be private or static. 

         (2)Onclick等事件处理: 

Java代码   收藏代码
  1. @OnClick(R.id.btnHello)  
  2. public void sayHi(){  
  3.     Toast.makeText(this,"你好!",Toast.LENGTH_SHORT).show();  
  4. }  


         (3)ListView的Adapter里的ViewHolder绑定问题。 


案例一 














         1. strings.xml。字符串。 

Xml代码   收藏代码
  1. <resources>  
  2.     <string name="app_name">ButterKnifeDemo</string>  
  3.   
  4.     <string name="hello_world">Hello world!</string>  
  5.     <string name="action_settings">Settings</string>  
  6.   
  7.     <string name="btn_good_night">Good Night!</string>  
  8.     <string name="btn_play">播放</string>  
  9.     <string name="btn_stop">停止</string>  
  10.     <string name="btn_view_holder">ViewHolder</string>  
  11. </resources>  


         2. activity_main.xml。布局 

Xml代码   收藏代码
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     tools:context=".MainActivity">  
  10.   
  11.     <Button  
  12.         android:id="@+id/btnHello"  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="wrap_content"  
  15.         android:text="@string/hello_world"/>  
  16.   
  17.     <Button  
  18.         android:id="@+id/btnGoodNight"  
  19.         android:layout_width="wrap_content"  
  20.         android:layout_height="wrap_content"  
  21.         android:layout_below="@id/btnHello"  
  22.         android:text="@string/btn_good_night"/>  
  23.   
  24.     <Button  
  25.         android:id="@+id/btnPlay"  
  26.         android:layout_width="wrap_content"  
  27.         android:layout_height="wrap_content"  
  28.         android:layout_below="@id/btnGoodNight"  
  29.         android:text="@string/btn_play"/>  
  30.   
  31.     <Button  
  32.         android:id="@+id/btnStop"  
  33.         android:layout_width="wrap_content"  
  34.         android:layout_height="wrap_content"  
  35.         android:layout_below="@id/btnPlay"  
  36.         android:text="@string/btn_stop"/>  
  37.   
  38.     <Button  
  39.         android:id="@+id/btnViewHolder"  
  40.         android:layout_width="wrap_content"  
  41.         android:layout_height="wrap_content"  
  42.         android:layout_below="@id/btnStop"  
  43.         android:text="@string/btn_view_holder"/>  
  44.   
  45. </RelativeLayout>  


         3. MainActivity。View绑定和Onclick事件处理 

Java代码   收藏代码
  1. package com.android.butterknifedemo;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.Menu;  
  6. import android.view.MenuItem;  
  7. import android.view.View;  
  8. import android.widget.Button;  
  9. import android.widget.Toast;  
  10.   
  11. import butterknife.ButterKnife;  
  12. import butterknife.InjectView;  
  13. import butterknife.OnClick;  
  14. import butterknife.Optional;  
  15.   
  16.   
  17. public class MainActivity extends Activity {  
  18.   
  19.     // 2. Actitvity里声明绑定控件  
  20.     // @Optional:加入后,若此id不存在,则程序不会崩溃,而是抛出异常  
  21.     @Optional@InjectView(R.id.btnHello)  
  22.     Button buttonHello;  
  23.     @InjectView(R.id.btnPlay)  
  24.     Button buttonPlay;  
  25.     @InjectView(R.id.btnStop)  
  26.     Button buttonStop;  
  27.   
  28.     @Override  
  29.     protected void onCreate(Bundle savedInstanceState) {  
  30.         super.onCreate(savedInstanceState);  
  31.         setContentView(R.layout.activity_main);  
  32.   
  33.         // 1. onCreate() 方法里注册 ButterKnife  
  34.         ButterKnife.inject(this);  
  35.     }  
  36.   
  37.     // 3. 注入 View 事件,不带参数  
  38.     @OnClick(R.id.btnHello)  
  39.     public void sayHi(){  
  40.         Toast.makeText(this,"你好!",Toast.LENGTH_SHORT).show();  
  41.     }  
  42.   
  43.     // 4. 注入 View 事件,带参数  
  44.     @OnClick(R.id.btnGoodNight)  
  45.     public void sayGoodNight(Button btnGoodNight){  
  46.         btnGoodNight.setText("晚上好!");  
  47.     }  
  48.   
  49.     // 5. 同时注入多个 View 事件  
  50.     @OnClick({R.id.btnPlay,R.id.btnStop})  
  51.     public void playMusic(View view){  
  52.         switch (view.getId()){  
  53.             case R.id.btnPlay:  
  54.                 Toast.makeText(this,"播放音乐",Toast.LENGTH_SHORT).show();  
  55.                 break;  
  56.             case R.id.btnStop:  
  57.                 Toast.makeText(this,"停止播放",Toast.LENGTH_SHORT).show();  
  58.         }  
  59.     }  
  60.   
  61.   
  62.     // ----------------------------------------------------------  
  63.     @Override  
  64.     public boolean onCreateOptionsMenu(Menu menu) {  
  65.         // Inflate the menu; this adds items to the action bar if it is present.  
  66.         getMenuInflater().inflate(R.menu.menu_main, menu);  
  67.         return true;  
  68.     }  
  69.   
  70.     @Override  
  71.     public boolean onOptionsItemSelected(MenuItem item) {  
  72.         // Handle action bar item clicks here. The action bar will  
  73.         // automatically handle clicks on the Home/Up button, so long  
  74.         // as you specify a parent activity in AndroidManifest.xml.  
  75.         int id = item.getItemId();  
  76.   
  77.         //noinspection SimplifiableIfStatement  
  78.         if (id == R.id.action_settings) {  
  79.             return true;  
  80.         }  
  81.   
  82.         return super.onOptionsItemSelected(item);  
  83.     }  
  84. }  


         4. MyAdapter。处理ListView的Adapter里的ViewHolder绑定问题。 

Java代码   收藏代码
  1. package com.android.butterknifedemo;  
  2.   
  3. import android.content.Context;  
  4. import android.view.LayoutInflater;  
  5. import android.view.View;  
  6. import android.view.ViewGroup;  
  7. import android.widget.BaseAdapter;  
  8. import android.widget.Button;  
  9. import android.widget.TextView;  
  10.   
  11. import butterknife.ButterKnife;  
  12. import butterknife.InjectView;  
  13.   
  14. /** 
  15.  * 在 ViewHolder 模式中注入 
  16.  */  
  17. // 1. 继承自 BaseAdapter  
  18. public class MyAdapter extends BaseAdapter{  
  19.     // 4. 定义上下文  
  20.     private Context mContext;  
  21.   
  22.     /** 
  23.      * 5. 构造方法 
  24.      * @param context 
  25.      */  
  26.     public MyAdapter(Context context) {  
  27.         // 上下文通过构造方法传过来  
  28.         mContext = context;  
  29.     }  
  30.   
  31.     @Override  
  32.     public int getCount() {  
  33.         return 0;  
  34.     }  
  35.   
  36.     @Override  
  37.     public Object getItem(int position) {  
  38.         return position;  
  39.     }  
  40.   
  41.     @Override  
  42.     public long getItemId(int position) {  
  43.         return 0;  
  44.     }  
  45.   
  46.     @Override  
  47.     public View getView(int position, View convertView, ViewGroup parent) {  
  48.         // 3. 声明 holder 为空  
  49.         ViewHolder holder = null;  
  50.   
  51.         // 6.  
  52.         if(holder==null){  
  53.             // 重新载入布局  
  54.             convertView = LayoutInflater.from(mContext).inflate(  
  55.                     R.layout.activity_main,parent,false);  
  56.             // 对 holder 进行实例化  
  57.             holder = new ViewHolder(convertView);  
  58.             // 获得按钮控件  
  59.             holder.btnViewHolder = (Button) convertView.findViewById(R.id.btnViewHolder);  
  60.             // 设置标签  
  61.             convertView.setTag(holder);  
  62.         } else {  
  63.             holder = (ViewHolder) convertView.getTag();  
  64.         }  
  65.         // 7.  
  66.         holder.btnViewHolder.setText("更改");  
  67.         return convertView;  
  68.     }  
  69.   
  70.     // 2. 写一个 结构持有者 类  
  71.     static class ViewHolder{  
  72.         @InjectView(R.id.btnViewHolder)  
  73.         Button btnViewHolder;  
  74.   
  75.         public ViewHolder(View view){  
  76.             ButterKnife.inject(this,view);  
  77.         }  
  78.     }  
  79. }  



案例二:用 ListView 展示一个列表数据,每个Item里含有一个Button,可以点击。 










         1. activity_main.xml。布局:一个ListView。 

Xml代码   收藏代码
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:paddingBottom="@dimen/activity_vertical_margin"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     tools:context=".MainActivity">  
  10.   
  11.     <ListView  
  12.         android:id="@+id/listView"  
  13.         android:layout_width="match_parent"  
  14.         android:layout_height="match_parent"/>  
  15.   
  16. </RelativeLayout>  


         2. item.xml。每一个ListView的项。包括一个文本和一个按钮 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:descendantFocusability="blocksDescendants"  
  6.     android:orientation="vertical">  
  7.   
  8.     <TextView  
  9.         android:id="@+id/tvText"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:text="@string/app_name" />  
  13.   
  14.     <Button  
  15.         android:id="@+id/btn"  
  16.         android:layout_width="wrap_content"  
  17.         android:layout_height="wrap_content"  
  18.         android:layout_toRightOf="@id/tvText" />  
  19.   
  20. </RelativeLayout>  


         注:ListView中出现button等可以拦截点击事件的控件的时候,要加属性: 

Xml代码   收藏代码
  1. android:descendantFocusability="blocksDesendants"  


         3. MyAdapter。自定义适配器。 

Java代码   收藏代码
  1. package com.android.bufferknifedemo;  
  2.   
  3. import android.content.Context;  
  4. import android.view.View;  
  5. import android.view.ViewGroup;  
  6. import android.widget.BaseAdapter;  
  7. import android.widget.Button;  
  8. import android.widget.TextView;  
  9. import android.widget.Toast;  
  10.   
  11. import java.util.ArrayList;  
  12.   
  13. import butterknife.ButterKnife;  
  14. import butterknife.InjectView;  
  15.   
  16. /** 
  17.  * Created by Xiangdong on 2015/7/12. 
  18.  */  
  19. public class MyAdapter extends BaseAdapter {  
  20.     Context mContext;  
  21.     private ArrayList<String> lists;  
  22.   
  23.     public MyAdapter(Context context, ArrayList<String> list) {  
  24.         mContext = context;  
  25.         lists = list;  
  26.     }  
  27.   
  28.     @Override  
  29.     public int getCount() {  
  30.         return lists.size();  
  31.     }  
  32.   
  33.     @Override  
  34.     public Object getItem(int position) {  
  35.         return lists.get(position);  
  36.     }  
  37.   
  38.     @Override  
  39.     public long getItemId(int position) {  
  40.         return position;  
  41.     }  
  42.   
  43.     @Override  
  44.     public View getView(int position, View convertView, ViewGroup parent) {  
  45.         ViewHolder holder = null;  
  46.         if (convertView == null) {  
  47.             convertView = View.inflate(mContext, R.layout.item, null);  
  48.             holder = new ViewHolder(convertView);  
  49.             convertView.setTag(holder);  
  50.         } else {  
  51.             holder = (ViewHolder) convertView.getTag();  
  52.         }  
  53.   
  54.         String s = lists.get(position);  
  55.         holder.tvText.setText(s);  
  56.         holder.btn.setOnClickListener(new View.OnClickListener() {  
  57.             @Override  
  58.             public void onClick(View v) {  
  59.                 Toast.makeText(mContext, "点击", Toast.LENGTH_SHORT).show();  
  60.             }  
  61.         });  
  62.         return convertView;  
  63.     }  
  64.   
  65.     static class ViewHolder {  
  66.         // 绑定控件  
  67.         @InjectView(R.id.tvText)  
  68.         TextView tvText;  
  69.         @InjectView(R.id.btn)  
  70.         Button btn;  
  71.   
  72.         public ViewHolder(View view) {  
  73.             ButterKnife.inject(this, view);  
  74.         }  
  75.     }  
  76. }  


         4. MainActivity。 

Java代码   收藏代码
  1. package com.android.bufferknifedemo;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.Menu;  
  6. import android.view.MenuItem;  
  7. import android.widget.ListView;  
  8. import android.widget.Toast;  
  9.   
  10. import java.util.ArrayList;  
  11.   
  12. import butterknife.ButterKnife;  
  13. import butterknife.InjectView;  
  14. import butterknife.OnItemClick;  
  15.   
  16. public class MainActivity extends Activity {  
  17.     @InjectView(R.id.listView)  
  18.     ListView listView;  
  19.     private MyAdapter adapter;  
  20.     private ArrayList<String> list;  
  21.   
  22.     @Override  
  23.     protected void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.activity_main);  
  26.   
  27.         ButterKnife.inject(this);  
  28.   
  29.         list = new ArrayList<>();  
  30.         list.add("测试1");  
  31.         list.add("测试2");  
  32.         list.add("测试3");  
  33.         list.add("测试4");  
  34.         list.add("测试5");  
  35.         list.add("测试6");  
  36.         list.add("测试7");  
  37.         list.add("测试8");  
  38.         list.add("测试9");  
  39.         adapter = new MyAdapter(this, list);  
  40.         listView.setAdapter(adapter);  
  41.     }  
  42.   
  43.     @OnItemClick(R.id.listView)  
  44.     public void onMyItemClick(int position) {  
  45.         Toast.makeText(this"位置:" + position, Toast.LENGTH_SHORT).show();  
  46.     }  
  47.   
  48.     // ------------------------------------------------------------------  
  49.     @Override  
  50.     public boolean onCreateOptionsMenu(Menu menu) {  
  51.         // Inflate the menu; this adds items to the action bar if it is present.  
  52.         getMenuInflater().inflate(R.menu.menu_main, menu);  
  53.         return true;  
  54.     }  
  55.   
  56.     @Override  
  57.     public boolean onOptionsItemSelected(MenuItem item) {  
  58.         // Handle action bar item clicks here. The action bar will  
  59.         // automatically handle clicks on the Home/Up button, so long  
  60.         // as you specify a parent activity in AndroidManifest.xml.  
  61.         int id = item.getItemId();  
  62.   
  63.         //noinspection SimplifiableIfStatement  
  64.         if (id == R.id.action_settings) {  
  65.             return true;  
  66.         }  
  67.   
  68.         return super.onOptionsItemSelected(item);  
  69.     }  
  70. }  

http://chatgpt.dhexx.cn/article/6cul3L0S.shtml

相关文章

ButterKnife黄油刀

ButterKnife黄油刀 1、强大的View绑定和Click事件处理功能&#xff0c;简化代码&#xff0c;提升开发效率 2、方便的处理Adapter里的ViewHolder绑定问题 3、运行时不会影响APP效率&#xff0c;使用配置方便 4、代码清晰&#xff0c;可读性强 怎么配置 在android Studio项…

Android版黄油刀简介

Butter Knife? 黄油刀是一个非常好的Android视图注入库。 黄油刀有助于减少许多样板代码&#xff08;例如&#xff0c;重复的findViewById调用&#xff09;。 如果您处理的活动具有大量的视图&#xff0c;那么您就会知道&#xff0c;将代码与“ findViewById”集群在一起时&a…

Android(ButterKnife)黄油刀使用详解

一、什么是ButterKnife黄油刀&#xff1f; 1.1ButterKnife中文又名黄油刀&#xff0c;是一款Android视图的字段和方法绑定快速注解框架。 1.2使用方法&#xff1a; 1.打开budild.gradle 文件 2.在dependencies 中添加 implementation com.jakewharton:butterknife:10.2.3// …

Android Butterknife(黄油刀) 使用方法总结

转载请标明出处&#xff1a;http://blog.csdn.net/donkor_/article/details/77879630 前言&#xff1a; ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象&#xff0c;有了ButterKnife可以很轻松的省去这些步骤。是大神JakeWha…

ArrayList$SubList.add导致的java.lang.StackOverflowError : null :慎用subList

项目场景&#xff1a; 上线后遇到的1个StackOverflowError问题&#xff0c;这里做个分析。通过日志文件可以看到&#xff1a; java.lang.StackOverflowError: nullat java.util.ArrayList$SubList.add(ArrayList.java:1047)at java.util.ArrayList$SubList.add(ArrayList.jav…

ArrayList和SubList的坑面试题

&#x1f468;&#x1f3fb;‍&#x1f393;博主介绍&#xff1a;大家好&#xff0c;我是芝士味的椒盐&#xff0c;一名在校大学生&#xff0c;热爱分享知识&#xff0c;很高兴在这里认识大家&#x1f31f; &#x1f308;擅长领域&#xff1a;Java、大数据、运维、电子 &#x…

NetSuite Sublist解释

今朝汇编一下Sublist主题的知识点以备忘。 2个数据源类型 Related Record - 以Saved Search建立的关联记录&#xff1b;Child Record - 父子表&#xff1b; 1. Related Record Saved Search关键点 这种形式的Sublist是利用Saved Search作为Sublist的数据源&#xff0c;将某…

各位,请慎用 subList!原来这么多坑!!

点击关注公众号&#xff0c;Java干货及时送达 1. 使用Arrays.asList的注意事项 1.1 可能会踩的坑 先来看下Arrays.asList的使用&#xff1a; List<Integer> statusList Arrays.asList(1, 2); System.out.println(statusList); System.out.println(statusList.contains(1…

Java中List的subList()方法及使用注意事项

List<Object> list new Arraylist<>();List<Object> subList list.subList(0, 5);其中subList(0, 5)取得的是下标为0到4的元素,不包含下标为5的元素. java.util.List中的subList方法返回列表中指定的 fromIndex&#xff08;包括 &#xff09;和 toIndex&a…

Java 中 List.subList() 方法的使用陷阱

转载请注明本文出自 clevergump 的博客&#xff1a;http://blog.csdn.net/clevergump/article/details/51105235, 谢谢! 前言 本文原先发表在我的 iteye博客: http://clevergump.iteye.com/admin/blogs/2211979, 但由于在 iteye发表的这篇文章的某些渲染曾经出现过一些问题, 我…

【Java】List的subList方法

Java的容器类ArrayList很常用&#xff0c;旗下存在一个subList方法&#xff0c;是值得注意的。 subList方法仅能够取出此ArrayList的引用&#xff0c;即使其看起来&#xff0c;好像是取出一个ArrayList的子ArrayList。 其实不然&#xff0c;subList方法的返回值&#xff0c;只是…

Java中的subList方法

Java中的subList方法 今天看到了java中List中有个subList的方法&#xff0c;感觉很熟悉有没有&#xff1f;没错&#xff0c;在Stirng类中&#xff0c;也有个类似的方法&#xff1a;subString。 Stirng中的subString方法&#xff0c;官方解释是&#xff1a;返回字符串的子字符串…

Java中List集合的subList方法

目录 一、说明 二、测试 1、直接输出 2、向subList中添加元素再输出 3、 从subList中删除元素再输出 4、向list中添加元素再输出 5、从list中删除一个元素后再输出 ​ 6、向list中添加元素&#xff0c;输出list&#xff0c;然后将subList传入ArrayList生成新集合在输出…

你真的会用ArrayList的subList方法吗?

导语 在日常的开发中通常会遇到截取List的情况&#xff0c;而大多数会选择使用subList方法进行截取&#xff0c;但是好多人对这个方法的理解都只是停留在使用层面上&#xff1f;这篇文章会非常详细达到源码级别的讲解sublList方法&#xff0c;需要的朋友赶紧收藏起来吧。 关于…

Java SubList 类 Java subList方法 Java ArrayList$SubList 方法特点 SubList 用法

Java SubList 类 Java subList方法 Java ArrayList$SubList 方法特点 SubList 用法 一、概述 在java集合中&#xff0c;常用ArrayList类中&#xff0c;若需要对 list进行截取&#xff0c;可以使用subList方法&#xff0c;进行生成 SubList的内部类&#xff0c;那么 ArrayList 和…

使用ArrayList中的subList方法

集合是Java开发日常开发中经常会使用到的。在之前的一些文章中&#xff0c;我们介绍过一些关于使用集合类应该注意的事项&#xff0c;如《为什么阿里巴巴禁止在 foreach 循环里进行元素的 remove/add 操作》、《为什么阿里巴巴建议集合初始化时&#xff0c;指定集合容量大小》等…

sublist详解

接口中定义 List<E> subList(int fromIndex, int toIndex);1&#xff0c;该方法返回的是父list的一个视图&#xff0c;从fromIndex&#xff08;包含&#xff09;&#xff0c;到toIndex&#xff08;不包含&#xff09;。fromIndextoIndex 表示子list为空 2&#xff0c;父…

数据建模应用

数据建模应用 一、为什么要数据建模二、数据建模种类1、关系建模&#xff08;3NF&#xff09;2、维度建模 三、3NF数据建模1、范式介绍2、3NF建模实战 四、维度建模1、维度和指标的概念2、星型模型3、雪花模型4、星型与雪花模型对比5、维度建模测试案例 五、3NF建模与维度建模的…

分享大数据建模工具-大数据挖掘建模平台

大数据挖掘建模平台 是面向企业级用户的大数据挖掘建模平台。平台采用可视化操作方式&#xff0c;通过丰富内置算法&#xff0c;帮助用户快速、一站式地进行数据分析及挖掘建模&#xff0c;可应用于处理海量数据、高复杂性的数据挖掘任务&#xff0c;为其提供准确、高精度的计算…

大数据之数据模型

一、星型摸型 事实表是记录一个事实的&#xff0c;可以理解为订单表&#xff0c; 纬度表是提供更丰富信息的表&#xff0c;可以理解为商品明细表、订单明细表&#xff1b; 它是由一个事实表和一组维表组成&#xff0c;每个维表都有一个维作为主键&#xff0c;所有这些维的主键…